1

次のように DefaultTableModel を使用しています。

  DefaultTableModel model = new DefaultTableModel (COLUMNS, 0 )
  {
      @Override
      public boolean isCellEditable(int row, int column)
      {
          return (getColumnName(column).equals("Selected"));
      }

      public Class getColumnClass(int columnIndex)
      {
          if(getColumnName(columnIndex).equals("Selected"))
              return Boolean.class;
          return super.getColumnClass(columnIndex);
      }     
  };

ここで、「選択済み」列で1つのチェックボックスのみを選択可能にしたいと考えています。これはどのように行うことができますか。次の方法も試しましたが、うまくいきません。

 public void fireTableCellUpdated(int row,int column)
 {
     if(getColumnName(column).equals("Selected"))
     {
         for(int i = 0; i<getRowCount() && i!=row;i++)
            setValueAt(Boolean.FALSE, row, column);
     }
 }
4

3 に答える 3

1
  • @eatSleepCode は @mKorbel を書きました setValueAt メソッドを実装するためのサンプルコードを教えてください。

  • (OP 使用) DefaultTableModel のコード、

  • for code based onは、AbstractTableModelnotifier のコード順序を保持する必要がありますfireTableCellUpdated(rowIndex, columnIndex)JTables view

  • これらの 2 つのモデルとその通知機能の間にはいくつかの重要な違いがあり、(私の見解)AbstractTableModel基本的なもの (テーブル モデルの 99%)を気にして使用する理由はありません。

ここに画像の説明を入力. . . . ここに画像の説明を入力. . . .ここに画像の説明を入力

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class TableRolloverDemo {

    private JFrame frame = new JFrame("TableRolloverDemo");
    private JTable table = new JTable();
    private String[] columnNames = new String[]{"Column"};
    private Object[][] data = new Object[][]{{false}, {false}, {true}, {true},
        {false}, {false}, {true}, {true}, {false}, {false}, {true}, {true}};

    public TableRolloverDemo() {
        final DefaultTableModel model = new DefaultTableModel(data, columnNames) {
            private boolean ImInLoop = false;

            @Override
            public Class<?> getColumnClass(int columnIndex) {
                return Boolean.class;
            }

            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return true;
            }

            @Override
            public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
                if (columnIndex == 0) {
                    if (!ImInLoop) {
                        ImInLoop = true;
                        Boolean bol = (Boolean) aValue;
                        super.setValueAt(aValue, rowIndex, columnIndex);
                        for (int i = 0; i < this.getRowCount(); i++) {
                            if (i != rowIndex) {
                                super.setValueAt(!bol, i, columnIndex);
                            }
                        }
                        ImInLoop = false;
                    }
                } else {
                    super.setValueAt(aValue, rowIndex, columnIndex);
                }
            }
        };
        table.setModel(model);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TableRolloverDemo tableRolloverDemo = new TableRolloverDemo();
            }
        });
    }
}
于 2013-07-30T12:01:39.643 に答える
-1

の列のすべてのチェック ボックスを結合する独自のカスタム セル エディターを作成できますButtonGroup。方法は次のとおりです。

public class VeryComplicatedCellEditor extends DefaultCellEditor {
    private ArrayList<ButtonGroup> groups;

    public getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        JCheckBox checkBox = new JCheckBox();
        growToSize(column);
        groups.get(column).add(checkBox);
        return checkBox;
    }

    private growToSize(int size) {
        groups.ensureCapacity(size);
        while (groups.size() < size)
            groups.add(new ButtonGroup());
    }
}

テーブルの大きさがわからないという事実から生じる複雑な問題がいくつかありますが、これらはほとんどgrowToSizeメソッドで処理されます。

ButtonGroupこれが機能する方法は、列ごとに 1 つずつ、 のリストを維持することです。各セルのエディター コンポーネントが、その列のボタン グループに追加されます。

于 2013-07-30T10:40:12.143 に答える