2014-02-25 50 views
0

我想實現JTable,該列有一列,編號爲JComboBox。我希望我的桌子最初只有一排。在設置ComboBox中的值後,我希望我的表格根據所選元素JComboBox填充一些值。選擇非空元素後,我想向表中添加新行。當有多行不爲空並且某人將第n個組合框的值設置爲空時,我想從表中刪除該行。使用JComboBox作爲編輯器的JTable - 刪除當前行

簡單的解決方案不起作用:

TableColumn column = table.getColumnModel().getColumn(2); 
JComboBox comboBox = new JComboBox(); 
comboBox.addItem(""); 
comboBox.addItem("1"); 
comboBox.addItem("2"); 
comboBox.addItem("3"); 
comboBox.addItem("4"); 
comboBox.addItem("5"); 
comboBox.addItemListener(new ItemListener() { 
    public void itemStateChanged(ItemEvent e) { 
     JComboBox combo = (JComboBox)e.getSource(); 
     if (combo.getSelectedItem() != null) { 
      if (combo.getSelectedItem().equals("")) { 
       table.getTableModel().removeRow(table.getSelectedRow()); 
      } else { 
       table.getTableModel().addRow(new Object[] {null, null, null, null}); 
      } 
     } 
    } 
}); 
column.setCellEditor(new DefaultCellEditor(comboBox)); 
+3

你需要重寫setValueAt在XxxTableModel,而不是由聽的ItemListener,那麼就沒有任何問題與.... – mKorbel

回答

2

所推薦的mKorbel,只是實現你的TableModelsetValueAt(...)方法的邏輯。下面是簡單的例子:

import javax.swing.DefaultCellEditor; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableColumn; 

public class Example extends JFrame { 

    private JTable table; 

    public Example(){ 
     table = getTable(); 
     add(new JScrollPane(table)); 

     pack(); 
     setVisible(true); 
    } 

    private JTable getTable() { 
     table = new JTable(new DefaultTableModel(3,3){ 
      @Override 
      public void setValueAt(Object aValue, int row, int column) { 
       super.setValueAt(aValue, row, column); 
       if(column == 2){ 
        if(aValue.toString().isEmpty()){ 
         removeRow(row); 
        } else { 
         addRow(new Object[] {null, null, null}); 
        } 
       } 
      } 
     }); 
     TableColumn column = table.getColumnModel().getColumn(2); 
     JComboBox<String> comboBox = new JComboBox<>(new String[]{"","1","2","3","4","5"}); 
     column.setCellEditor(new DefaultCellEditor(comboBox)); 
     return table; 
    } 

    public static void main(String[] values){ 
     new Example(); 
    } 

} 
+0

我沒有訪問我的PC roght現在,所以我有另一個問題:setValueAt僅在值更改時調用,或者我需要添加檢查值是否已更改? – karex

+1

您需要檢查值是否已更改,因爲在完成編輯單元格時總是調用setValueAt(...)。 – alex2410

相關問題