繁体   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