2009-09-25 269 views

回答

32

您不会将它添加到行 - 您将其添加到单元格。 This tutorial描述你所需要的。

+2

好的,谢谢Droidln.net – 2009-09-25 05:50:41

+7

无需感谢,只需勾选标记:) – Bostone 2009-09-25 16:12:56

+2

waw!我刚刚打开了该示例,并意识到源代码向CellEditor添加了一个“新的JCheckbox”。 但实际上它呈现为JButton。无论如何,我的问题是,为什么我们应该把JCheckBox放进去呢? :( – gumuruh 2012-01-10 09:48:17

20

您可以将Component添加为表格单元格。

首先,应实现有一个JButton作为父类的类和两个接口是的TableCellRenderer和TableCellEditor的。

应该实现TableCellEditor的原因是用于接收按钮的动作事件。

public class TableButton extends JButton implements TableCellRenderer, TableCellEditor { 
    private int selectedRow; 
    private int selectedColumn; 
    Vector<TableButtonListener> listener; 

    public TableButton(String text) { 
    super(text); 
    listener = new Vector<TableButtonListener>(); 
    addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     for(TableButtonListener l : listener) { 
      l.tableButtonClicked(selectedRow, selectedColumn); 
     } 
     } 
    }); 
    } 

    public void addTableButtonListener(TableButtonListener l) { 
    listener.add(l); 
    } 

    public void removeTableButtonListener(TableButtonListener l) { 
    listener.remove(l); 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, 
    Object value, boolean isSelected, boolean hasFocus, int row, int col) { 
    return this; 
    } 

    @Override 
    public Component getTableCellEditorComponent(JTable table, 
     Object value, boolean isSelected, int row, int col) { 
    selectedRow = row; 
    selectedColumn = col; 
    return this; 
    } 

    @Override 
    public void addCellEditorListener(CellEditorListener arg0) {  
    } 

    @Override 
    public void cancelCellEditing() { 
    } 

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

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

    @Override 
    public void removeCellEditorListener(CellEditorListener arg0) { 
    } 

    @Override 
    public boolean shouldSelectCell(EventObject arg0) { 
    return true; 
    } 

    @Override 
    public boolean stopCellEditing() { 
    return true; 
    } 
} 

然后,我添加了一个名为TableButtonListener的EventListener来处理按钮事件,如下所示。

public interface TableButtonListener extends EventListener { 
    public void tableButtonClicked(int row, int col); 
} 

并使用上面的Renderer/Editor。

TableButton buttonEditor = new TableButton("Button"); 
buttonEditor.addButtonListener(new TableButtonListener() { 
    @Override 
    public void tableButtonClicked(int row, int col) { 
    // do something 
    }  
}); 

TableColumn col = new TableColumn(1, 80); 
col.setCellRenderer(buttonEditor); 
col.setCellEditor(buttonEditor); 

cols.addColumn(colPattern); 

如果你想显示不同的按钮的每一行标签,你应该插入的代码块到getTableCellRendererComponent和getTableCellEditorComponent这是修改按钮的标签。

编辑:代码编译现在。修复了TableButton构造函数中的包围错误。

+0

感谢xrath的帮助 – 2009-09-25 05:52:59

+3

-1这是非法的实现CellEditor中的:可以通过合同,它_must_通知已注册的CellEditorListeners,它可以轻松实现addEditorListener的空实现;-)超级合约__必须由实现服务,没有办法。 – kleopatra 2011-10-05 09:51:10

+1

我试过了,我得到了......未定义的变量'listener'...那是什么? :( – gumuruh 2012-01-10 07:44:49

相关问题