簡體   English   中英

如何以編程方式更新jtable單元格和TableModel?

[英]How to update jtable cell and TableModel programmatically?

我需要確保僅選中列中的一個復選框。 因此,當用戶選中復選框時,我必須取消選擇先前選擇的復選框。

我嘗試在TableModel的setValueAt方法中執行此操作,但是我無法更新單元格,即使單擊按鈕也無法更新該單元格。 我沒有顯示我的所有代碼,而是創建了一個簡單的示例,該示例應有助於嘗試解決方案:

public class DateFormatDemo extends JFrame
{
    private JTable dataSearchResultTable;

    public DateFormatDemo()
    {
        JPanel panel = new JPanel(new GridLayout(2, 1, 5, 10));
        panel.setPreferredSize(new Dimension(500, 300));
        dataSearchResultTable = new JTable(new MyTableModel());

        dataSearchResultTable.setSelectionBackground(new Color(0xaaaaff));
        dataSearchResultTable.setFillsViewportHeight(true);
        dataSearchResultTable.setRowSelectionAllowed(true);
        dataSearchResultTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        dataSearchResultTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        dataSearchResultTable.setRowHeight(25);

        panel.add(new JScrollPane(dataSearchResultTable));
        super.getContentPane().add(panel);
        super.pack();
        super.setDefaultCloseOperation(EXIT_ON_CLOSE);
        super.setVisible(true);
    }

    class MyTableModel extends AbstractTableModel
    {
        private String[] columnNames = { "First Name", "Last name", "Vegetarian" };
        private Object[][] data;

        MyTableModel()
        {
            data = new Object[][] { { "Vova", "KipokKipokKipokKipok", false }, { "Olia", "Duo", true },
                    { "Ivan", "Brown", false } };
            fireTableDataChanged();
        }

        public int getColumnCount()
        {
            return columnNames.length;
        }

        public int getRowCount()
        {
            return data.length;
        }

        public String getColumnName(int col)
        {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col)
        {
            if (data.length > 0 && data[0] != null) {
                return data[row][col];
            }
            return null;
        }

        public Class getColumnClass(int c)
        {
            Object valueAt = getValueAt(0, c);
            return valueAt == null ? Object.class : valueAt.getClass();
        }

        public boolean isCellEditable(int row, int col)
        {
            return true;
        }

        public void setValueAt(Object value, int row, int col)
        {
            if (data.length > 0 && data[0] != null) {
                data[row][col] = value;
                fireTableCellUpdated(row, col);
            }
        }
    }

    public static void main(String[] args) throws ParseException
    {
        new DateFormatDemo();
    }
}

因此,我希望Vegeterian列僅選擇一個復選框,並且當用戶選擇一個復選框時,另一個應該變為未選中狀態。

謝謝!

很大程度上取決於模型的結構。

基本上,在您的setValueAt方法中,當您確定“復選框”列已更改時,您將需要在該列中找到(我認為是) true並將其設置為false任何值,從而觸發TableCellUpdated事件,指示您ve更改了單元格的值。

假設只有一個單元格可以是true ,那么您可以在此時中斷並繼續按照常規修改單元格值。

另一個風險更大的解決方案可能是維護最后一個為真的單元格的行索引,並在值更改時簡單地休息它。

這里的風險來自於確保在構建模型時,您知道哪一行是true ,底層數據遵循您的規則(並且只有一個true行),並且缺乏對后備數據的控制(在此示例中可能不是,但在其他示例中)

使用return valueAt == null ? Object.class : valueAt.getClass(); return valueAt == null ? Object.class : valueAt.getClass(); 在您的getColumnClass方法中是個壞主意。 您應該傳回適當的已知值。

在構造函數中調用fireTableDataChanged是沒有意義的,還沒有人可以將偵聽器附加到模型中。

暫無
暫無

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

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