向JTable添加按钮

3
我搜索了如何在jtable中添加按钮的教程,发现了一个来自http://tips4java.wordpress.com/2009/07/12/table-button-column/的类文件。在哪里设置按钮的标签呢?
      [code]
   private void createTable(){
       model = new DefaultTableModel();
       editorTable.setModel(model);
       model.addColumn("COL1");
       model.addColumn("COL2");
       model.addColumn("ADD");
       model.addColumn("DELETE");
       model.addRow(new Object[]{"DATA1", "DATA2"});

       Action delete = new AbstractAction() {

       @Override
       public void actionPerformed(ActionEvent e) {
           editorTable = (JTable) e.getSource();
           int modelRow = Integer.valueOf(e.getActionCommand());
           ((DefaultTableModel) editorTable.getModel()).removeRow(modelRow);
       }
   };

         ButtonColumn bc = new ButtonColumn(editorTable, delete, 3);
         bc.setMnemonic(KeyEvent.VK_D);
  }

     [/code]

请看这里:https://dev59.com/QnM_5IYBdhLWcg3wNwQv - MByD
你有没有查看过关于JTable的Oracle Java教程:http://docs.oracle.com/javase/tutorial/uiswing/components/table.html 在那里可以查看Renderers和Editors。 - asela38
Binyamin,感谢您的回复,我已经实现了这个类,它运行得很好,但是我找不到在哪里添加按钮的标签。 - FirmView
2个回答

4

表格的渲染器和编辑器根据您的DefaultTableModel中的数据自动设置。例如,对于表格编辑器,代码如下:

public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column) {
  ...
  editButton.setText( value.toString() );
  editButton.setIcon( null );
  ...
}

此处value是您的表格模型中的值。有关详细信息,请参见ButtonColumn.java

编辑:由于您正在添加4列,因此应该将行数据更改为:

model.addRow(new Object[]{"DATA1", "DATA2", "DATA3", "DELETE"});

为了在第四列上看到删除按钮。

谢谢,Kaka,我看了代码,它是editorValue。如果我想要标签的名称为 DELETE,我应该在哪里进行更改? - FirmView
1
+1 如果你理解了这篇博客文章 :) 正如博客所说,“你可以将文本(或图标)存储在TableModel中,而ButtonColumn会在按钮上呈现文本(或图标)”。因此,你可以像添加其他文本字符串到模型中一样,以相同的方式向TableModel添加文本字符串,只是渲染方式不同。 - camickr
博客文章中的代码存在潜在问题:它无法处理多个“按钮列”。它只允许选择一个列作为按钮呈现。 - Pierre Henry

-1
    MyClass myClass = new MyClass();
    jTable1.getColumnModel().getColumn(0).setCellEditor(myClass);
    jTable1.getColumnModel().getColumn(0).setCellRenderer(myClass);
class MyClass extends AbstractCellEditor implements TableCellEditor, TableCellRenderer
{

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
    {
    JPanel panel=(JPanel)jTable1.getCellRenderer(row, column).getTableCellRendererComponent(table, value, isSelected, isSelected, row, column);
    panel.setBackground(table.getSelectionBackground());    
    return panel;
    }

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

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        AbstractAction action = new AbstractAction()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                JOptionPane.showMessageDialog(rootPane,"Row :"+jTable1.getSelectedRow()+"    "+ e.getActionCommand() + " clicked");
            }
        };
        JButton button1 = new JButton(action);
        JButton button2 = new JButton(action);
        button1.setText("Button1");
        button2.setText("Button2");

        JPanel panel = new JPanel();
        panel.add(button1);
        panel.add(button2);
        panel.setBackground(table.getBackground());
        return panel;
    }
}

}


这个有多个问题,例如:a)cellEditor实现无效:它必须在终止时通知其监听器b)一直创建新组件c)假设默认渲染器为JPanel类型d)... - kleopatra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接