簡體   English   中英

選擇后,JTable將JComboBox和JCheckBox還原為值

[英]JTable Reverts JComboBox and JCheckBox to Values after Selection

我有一個JTable,其中有一列JComboBox<Integer>和一列JCheckBox 使用適當的渲染器和編輯器設置JTable。 該表最初看起來不錯,但是從組合框或復選框中選擇了一個值之后,單元格似乎恢復為Integer和Boolean的值。 這個問題似乎不僅僅是表面上的問題,因為預期具有組合框或復選框的單元格的方法會在查找整數或布爾值時引發錯誤。

這是它的外觀圖:

在此處輸入圖片說明

這是代碼:

    dataTable.removeAll();
    numberOfVariables = 7;
    Object[] header = new Object[numberOfVariables];
    header[0] = new String("Ring Number");
    header[1] = new String("Radius (cm)");
    header[2] = new String("Plume Distribution");
    header[3] = new String("Thickness (A)");
    header[4] = new String("Deposition Time (s)");
    header[5] = new String("Rate (A/s)");
    header[6] = new String("Optimize (y/n)");

    Object[][] data = new Object[numberOfRings][numberOfVariables];
    for(int k=0;k<numberOfRings;++k){
        Object[] row = new Object[numberOfVariables];
        row[0] = Integer.toString(k+1);
        row[1] = String.format("%.2f", plume.getRingRadius(k));
        row[2] = createDistributionComboBoxForRing(k);
        row[3] = String.format("%.2f", plume.getThicknessOfRing(k));
        row[4] = String.format("%.2f", plume.getTimeForRing(k));
        row[5] = String.format("%.2f", plume.getRateForRing(k));
        row[6] = new JCheckBox();
        ((JCheckBox) row[6]).setSelected(true);
        data[k] = row;
    }
    tableModel = new DefaultTableModel(data,header);
    dataTable.setModel(tableModel);
    dataTable.getColumnModel().getColumn(2).setCellRenderer(new ControlTableRenderer());
    //dataTable.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor( createDistributionComboBoxForRing(0) ));
    dataTable.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor( (JComboBox<Integer>) data[0][2] ));
    dataTable.getColumnModel().getColumn(6).setCellRenderer(new ControlTableRenderer());
    dataTable.getColumnModel().getColumn(6).setCellEditor(new DefaultCellEditor( (JCheckBox) data[0][6] ));
    dataTable.updateUI();
row[2] = createDistributionComboBoxForRing(k);
row[3] = String.format("%.2f", plume.getThicknessOfRing(k));
row[4] = String.format("%.2f", plume.getTimeForRing(k));
row[5] = String.format("%.2f", plume.getRateForRing(k));
row[6] = new JCheckBox();
((JCheckBox) row[6]).setSelected(true);

JTable的TableModel存儲數據,而不存儲組件。

因此,如果列3包含一個Integer對象,則將一個Integer存儲在TableModel ,並將該列的編輯器設置為包含有效Integer列表的組合框。

與包含復選框渲染器/編輯器的列相同。 在這種情況下,您將存儲一個Boolean對象。

例如:

row[2] = new Integer(1);
row[6] = Boolean.TRUE

現在,在TableModel中,您需要告訴表每一列中的數據類型,因此您需要重寫getColumnClass(...)方法。 就像是:

tableModel = new DefaultTableModel(data,header)
{
    @Override
    public Class getColumnClass(int column)
    {
        switch (column)
        {
            case 2: return Integer.class;
            case 6: return Boolean.class;
            default: return Object.class;
        }
    }
};

現在,表格可以為每列選擇適當的渲染器和編輯器。

但是,對於組合框,必須使用組合框的值創建一個自定義編輯器。 有關如何執行此操作的工作示例,請參見Swing教程中有關使用組合框作為編輯器的部分。

另外,您錯誤地使用了其他一些方法:

dataTable.removeAll();

不知道那是為了什么。 這是一種從面板上刪除組件的Container方法。 您需要做的就是setModel(...)語句以重置表。

dataTable.updateUI();

無需使用updateUI()方法。 更改LAF時在內部使用該方法。 您沒有更改LAF,因此請擺脫該聲明。

單元格渲染器和編輯器的想法是,您只有一個組件,並且四處移動並且每行更改數據。 該代碼為每個單元使用一個不同的JComponent實例。 只需將數據放入表模型中,然后讓單元格渲染器和編輯器管理組件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM