【问题标题】:How to update jtable cell and TableModel programmatically?如何以编程方式更新 jtable 单元格和 TableModel?
【发布时间】:2013-11-09 09:30:34
【问题描述】:

我需要确保仅选中列中的一个复选框。因此,当用户选择复选框时,我必须取消选择之前的选择。

我尝试在 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 列只选择一个复选框,当用户选择一个复选框时,另一个应该被取消选中。

谢谢!

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    很大程度上取决于模型的结构。

    基本上,在您的setValueAt 方法中,当您确定“复选框”列已更改时,您需要在该列中找到任何值(我假设)true 并将其设为false,触发TableCellUpdated 事件,表明您已更改单元格值。

    假设只有一个单元格可以是true,您可以在该点中断并按照正常方式继续修改单元格值。

    另一个风险更大的解决方案可能是保持最后一个被设置为真的单元格的行索引,并在值更改时简单地休息...

    这里的风险来自确保在构建模型时,您知道哪一行是 true,基础数据遵循您的规则(并且只有一个 true 行)以及缺乏对支持数据的控制(可能不在这个例子中,但在其他例子中)

    在您的getColumnClass 方法中使用return valueAt == null ? Object.class : valueAt.getClass(); 是个坏主意。您应该传回适当的已知值。

    在构造函数中调用fireTableDataChanged 是没有意义的,还没有人可能将侦听器附加到您的模型。

    【讨论】:

      猜你喜欢
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 2010-11-22
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多