2

列のチェックボックスが 1 つだけ選択されていることを確認する必要があります。したがって、ユーザーがチェックボックスを選択すると、以前に選択したものを選択解除する必要があります。

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 列でチェックボックスを 1 つだけ選択し、ユーザーが 1 つのチェックボックスを選択すると、別のチェックボックスが選択されないようにする必要があります。

ありがとうございました!

4

1 に答える 1

1

モデルがどのように構成されているかによって、多くのことが決まります。

基本的に、あなたのsetValueAt方法では、「チェックボックス」列が変更されたと判断した場合、その列の値を見つけて(私は推測する)trueそれを作成しfalseTableCellUpdatedイベントを発生させて、セルを変更したことを示す必要があります価値。

セルが 1 つだけであると仮定するとtrue、その時点で中断し、通常どおりセル値を変更し続けることができます。

別の、より危険な解決策は、true になった最後のセルの行インデックスを維持し、値が変更されたときに単純にそれを休止することです...

ここでのリスクは、モデルが構築されたときに、どの行がtrueであるかを確実に把握していること、基になるデータがルールに従っていること (そして 1 つの行しかないtrueこと)、およびバッキング データに対する制御の欠如 (この例ではそうではないかもしれませんが、その他の例)

メソッドで使用return valueAt == null ? Object.class : valueAt.getClass();するのgetColumnClassは悪い考えです。適切な既知の値を返す必要があります。

コンストラクターでの呼び出しfireTableDataChangedは無意味です。まだ誰もあなたのモデルにリスナーをアタッチしていない可能性があります。

于 2013-11-09T11:03:10.643 に答える