Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > JTable


Автор: Andyb 8.6.2004, 12:39
Есть вопрос: как сделать редактором ячейки таблицы текстовую область с кнопкой вместо стандартных JCheckBox или JComboBox. Пример http://kofein-vrn.narod.ru/qw.htm

Автор: Domestic Cat 8.6.2004, 16:30
Pomestit' knopku v JTable mozhno tak:
Код

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;


class JTableButtonRenderer implements TableCellRenderer
{
 private TableCellRenderer defaultRenderer;

 public JTableButtonRenderer(TableCellRenderer renderer)
{
   defaultRenderer = renderer;
 }

 public Component getTableCellRendererComponent(JTable table, Object value,
                                                boolean isSelected,
                                                boolean hasFocus,
                                                int row, int column)
 {
   if(value instanceof Component)
     return (Component)value;
   return defaultRenderer.getTableCellRendererComponent(
          table, value, isSelected, hasFocus, row, column);
 }
}

class JTableButtonModel extends AbstractTableModel
{
 private Object[][] rows = new Object[4][2];
 
 JTableButtonModel()
 {
   MyButton b1 = new MyButton("Change font");
   MyButton b2 = new MyButton("Change size");
   MyButton b3 = new MyButton("Change spacing");
   MyButton b4 = new MyButton("Change margin");
   rows[0][0] = "Font";
   rows[0][1] = b1;
   rows[1][0] = "Size";
   rows[1][1] = b2;
   rows[2][0] = "Spacing";
   rows[2][1] = b3;
   rows[3][0] = "Margin";
   rows[3][1] = b4;
   EventButHandler eventHandler = new EventButHandler();
   eventHandler.register(b1, b2, b3, b4);
   b1.addActionListener(eventHandler);
   // etc ...
 }

 private String[] columns = { "Numbers", "Buttons" };

 public String getColumnName(int column)
{
   return columns[column];
 }

 public int getRowCount()
{
   return rows.length;
 }

 public int getColumnCount()
 {
   return columns.length;
 }

 public Object getValueAt(int row, int column)
{
     return rows[row][column];
 }

 public boolean isCellEditable(int row, int column)
{
   return false;
 }

 public Class getColumnClass(int column)
{
   return getValueAt(0, column).getClass();
 }
}
class EventButHandler implements ActionListener
{
   MyButton b1, b2, b3, b4;
   void register (MyButton b1, MyButton b2, MyButton b3, MyButton b4)
   {
       this.b1= b1;
       this.b2 = b2;
       this.b3 = b3;
       this.b4 = b4;
   }
   
   public void actionPerformed(ActionEvent ae)
   {
       
       if (ae.getSource().equals(b1))
       {
           System.out.println("Button pressed");
       }
   }
   

}
class MyButton extends JButton
{
   MyButton(String name)
   {
       super(name);
   }
   
   void fireEvent(ActionEvent ae)
   {
       fireActionPerformed(ae);
   }
}
class JTableButtonMouseListener implements MouseListener
{
 private JTable table;

 private void forwardEventToButton(MouseEvent e) {
   TableColumnModel columnModel = table.getColumnModel();
   int column = columnModel.getColumnIndexAtX(e.getX());
   int row    = e.getY() / table.getRowHeight();
   Object value;
   MyButton button;
   MouseEvent buttonEvent;

   if(row >= table.getRowCount() || row < 0 ||
      column >= table.getColumnCount() || column < 0)
     return;

   value = table.getValueAt(row, column);

   if(!(value instanceof MyButton))
     return;
     button = (MyButton)value;
     button.fireEvent(new ActionEvent(button, ActionEvent.ACTION_PERFORMED, ""));
 }

 public JTableButtonMouseListener(JTable table)
{
   this.table = table;
 }

 public void mouseClicked(MouseEvent e)
{
   //forwardEventToButton(e);
 }

 public void mouseEntered(MouseEvent e)
{
 }

 public void mouseExited(MouseEvent e)
{
 }

 public void mousePressed(MouseEvent e)
{
 forwardEventToButton(e);
 }

 public void mouseReleased(MouseEvent e)
{
 }
}

public final class JTableButton extends JFrame
{
 private JTable table;
 private JScrollPane scrollPane;

 public JTableButton() {
   super("JTableButton Demo");
   TableCellRenderer defaultRenderer;

   table = new JTable(new JTableButtonModel());
   defaultRenderer = table.getDefaultRenderer(JButton.class);
   table.setDefaultRenderer(JButton.class,
                              new JTableButtonRenderer(defaultRenderer));
   table.setPreferredScrollableViewportSize(new Dimension(400, 200));
   table.addMouseListener(new JTableButtonMouseListener(table));

   scrollPane = new JScrollPane(table);
   setContentPane(scrollPane);
 }

 public static void main(String[] args)
{
   Frame frame;
   WindowListener exitListener;

   exitListener = new WindowAdapter() {
     public void windowClosing(WindowEvent e) {
       Window window = e.getWindow();
       window.setVisible(false);
       window.dispose();
       System.exit(0);
     }
   };

   frame = new JTableButton();
   frame.addWindowListener(exitListener);
   frame.pack();
   frame.setVisible(true);
 }
}



Nu a kak sovmestit' ee e JLabel - nuzhno podumat'.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)