java - TableCellEditor 类不起作用

标签 java swing

我试图在每一行的末尾添加按钮,到目前为止我已经使用 cellRenderer 来做到这一点。并且我已经成功地在每一行中显示按钮,就像在快照中一样。 Table populated with buttons in each row 但是当我单击按钮时,没有任何操作发生。 我想在单击按钮时调用一个新框架。 以下是我的源代码:

1.用于填充 Jtable

try
{
    String url="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=c:\\ninedots.accdb";
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection con=DriverManager.getConnection(url);
    String sql1="SELECT RMA_No,CallDate,Source,Item,BookingDesc,Customer,Contact,CallType,CallMode,MaterialRequired,TotalMaterialRequiredCost,AssignedTo,CallStatus FROM RMA_Master WHERE (((CallDate) Between #"+fromdate1+"# And #"+todate1+"#)) AND CallStatus='"+Status+"'";
    PreparedStatement pst=con.prepareStatement(sql1);
    ResultSet rs=pst.executeQuery();
    dtm=(DefaultTableModel) DbUtils.resultSetToTableModel(rs);
    dtm.addColumn("Action");                
    table.setModel(dtm);
    table.getColumn("Action").setCellRenderer(new ButtonCellRenderer());
    table.getColumn("Action").setCellEditor(new ButtonCellEditor());
    rs.close();
    pst.close();
    con.close();
}
catch(Exception ex)
{
    System.err.print("Exception: ");
    System.err.println(ex.getMessage());
}

2.ButtonCellRenderer类

 public class ButtonCellRenderer extends JButton implements TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if (value != null) {
            setText("Edit" + value.toString());
        } else {
            setText("Edit");             
        }
        if (isSelected) {
            setForeground(table.getSelectionForeground());
            setBackground(table.getSelectionBackground());
        } else {
            setForeground(table.getForeground());
            setBackground(UIManager.getColor("Button.background"));
        }
        return this;
    }
}

3.ButtonCellEditor类

 public class ButtonCellEditor extends AbstractCellEditor implements TableCellEditor {

    /**
 * 
 */
private static final long serialVersionUID = 1L;
    private JButton editor;
    private Object value;
    private int row;
    private JTable table;

    public ButtonCellEditor() {
        editor = new JButton();
        editor.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                  if (table != null) {
                        fireEditingStopped();
                        TableModel model = table.getModel();
                        if (model instanceof DefaultTableModel) {
                            ((DefaultTableModel) model).removeRow(row);
                        }
                    }
            }
        });
    }

    @Override
    public boolean isCellEditable(EventObject e) {
        return true;
    }

    @Override
    public Object getCellEditorValue() {
        return value;
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        this.table = table;
        this.row = row;
        this.value = value;
        if (value != null) {
            editor.setText("Delete row " + value.toString());
        } else {
            editor.setText("Delete Me");
        }
        if (isSelected) {
            editor.setForeground(table.getSelectionForeground());
            editor.setBackground(table.getSelectionBackground());
        } else {
            editor.setForeground(table.getForeground());
            editor.setBackground(UIManager.getColor("Button.background"));
        }
        return editor;
    }


}

请针对以下问题提出解决方案。或者我在哪里做错了?

最佳答案

查看Table Button Column自定义渲染器/编辑器,允许您向任何列添加带有自定义操作的按钮。

您编写的唯一代码是Action,因此很容易实现:

Action delete = new AbstractAction()
{
    public void actionPerformed(ActionEvent e)
    {
        JTable table = (JTable)e.getSource();
        int modelRow = Integer.valueOf( e.getActionCommand() );
        ((DefaultTableModel)table.getModel()).removeRow(modelRow);
    }
};

关于java - TableCellEditor 类不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29647762/

相关文章:

java - 如何添加 Onclick 按钮以显示 LineChart JavaFX

java - 在java中更改特定的文本颜色

java - setSize 不影响按钮的大小

java - 如何防止在 JTable 单元格中输入数字以外的字符?

java - Web 服务契约首先逆转 - 引用 WSDL 中的 Java 类

java - JCheckBoxMenuItem 只有一个被选中

java - 如何创建Scene2d标签?

java - 更新到最新的 Spring boot 版本 spring-boot-starter-parent 2.6.2 后,我的测试停止执行

Java - 套接字和 Swing

java - 如何使用复选框将表格单元格从可编辑更改为不可编辑