2015-08-18 49 views
0

我有問題關於添加JComboBox,以擴展ObjectTableModel(表是OmniJTable)的自定義表模型中的列。我工作了2天,無法解決這個問題。JComboBox自定義表模型

我解決的一件事是在列中顯示JComboBox,但現在我有選擇任何東西的問題(似乎它不可編輯,和像「setEditable()」不工作)的任何東西。

這裏是代碼,我添加jComboBox到我的OmniJTable與ObjectTableModel。

class CheckBoxCellRenderer extends JComboBox implements TableCellRenderer { 
    JComboBox combo; 
    public CheckBoxCellRenderer(JComboBox comboBox) { 
     this.combo = new JComboBox(); 
     for (int i=0; i<comboBox.getItemCount(); i++){ 
      combo.addItem(comboBox.getItemAt(i)); 
     } 
    } 
    @Override 
    public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     combo.setSelectedItem(value); 
     return combo; 
    } 
} 
private void addComboBoxToStatusColumn(JTable table) 
{ 
    final int statusColumnIndex = bazaTelefonowOmniJTable.getColumnModel().getColumnIndex("Status"); 

    TableColumn tmpColum = bazaTelefonowOmniJTable.getColumnModel().getColumn(statusColumnIndex); 
    final JComboBox comboBox = new JComboBox(); 
    comboBox.setEditable(true); 
    comboBox.setEnabled(true); 
    loadRecordStatusFromDictionary(comboBox); 


    DefaultCellEditor defaultCellEditor=new DefaultCellEditor(comboBox); 
    tmpColum.setCellEditor(defaultCellEditor); 
    tmpColum.setCellRenderer(new CheckBoxCellRenderer(comboBox)); 
    bazaTelefonowOmniJTable.setEditable(true); 
    //table.repaint(); 
} 

正如我所說的,這一個JComboBox的增加列,但我不知道如何使這一個讓我選擇的JComboBox項目。

PS:Sry爲我的英語,這不是我的主要語言。

+0

您需要設置一個編輯器,它是JComboBox並使用Label作爲單元格渲染器。當用戶雙擊單元格時,顯示組合框。如果您需要代碼,請留言。 – KDM

+0

@KDM Ty回覆,你能貼一些代碼示例嗎? – Thodgnir

回答

1

最簡單的是不要添加一個CellRenderer。在這種情況下,表格會將其呈現爲標籤,並在單擊時顯示組合框。以下是一個示例:

package snippet; 

import java.awt.Component; 

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

public class JTableTest extends JFrame { 

    public JTableTest() { 
     super(JTableTest.class.getName()); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     initComponents(); 
    } 

    private void initComponents() { 
     JTable table = new JTable(new Object[][] { { "1", "One" }, { "2", "Two" } }, new Object[] { "Column One", "Status" }); 
     addComboBoxToStatusColumn(table); 
     add(new JScrollPane(table)); 
     pack(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override public void run() { 
       new JTableTest().setVisible(true); 
      } 
     }); 
    } 

    private void addComboBoxToStatusColumn(JTable table) { 
     final int statusColumnIndex = table.getColumnModel().getColumnIndex("Status"); 

     TableColumn tmpColum = table.getColumnModel().getColumn(statusColumnIndex); 
     final JComboBox comboBox = new JComboBox(); 
     loadRecordStatusFromDictionary(comboBox); 

     DefaultCellEditor defaultCellEditor = new DefaultCellEditor(comboBox); 
     tmpColum.setCellEditor(defaultCellEditor); 
    } 

    private void loadRecordStatusFromDictionary(JComboBox comboBox) { 
     comboBox.addItem("Two"); 
     comboBox.addItem("Four"); 
     comboBox.addItem("Six"); 
    } 
} 

您還需要覆蓋模型中的isCellEditable方法。

model = DaneTableModel(some arg) { 
    public boolean isCellEditable(int row, int col) { 
     if(col == STATUS_COLUMN) return true ; 
     return false; 
    } 
} 
+0

像你這樣的代碼是我的第一個想法來解決這個問題,但可悲的是它不適用於我的具體表。 當我檢查它與 System.out.println(「IsCellEditable =」+ bazaTelefonowOmniJTable.isCellEditable(5,statusColumnIndex)); 它返回false,是否有任何要強制這些單元格可編輯? – Thodgnir

+0

您是否將模型附加到桌子上? 'TableModel'有一個應該返回true的'isCellEditable'。 – KDM

+0

是啊,我調用我的addComboBoxToStatusColumn方法之前,model = DaneTableModel(一些arg)(自定義模型,其中一個擴展ObjectTableModel)和bazaTelefonowOmniJTable.setModel(模型)。你認爲我應該在DaneTableModel中重寫某種方法來使這些單元格可編輯? PS:sry延遲我有互聯網連接問題:) – Thodgnir