2009-09-25 264 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

相關問題