3

これまで、次のような JTable の定義がありました。

    JTable table = new JTable(model) {
        @Override
        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
            Component c = super.prepareRenderer(renderer, row, column);
            TradeTableModel model = (TradeTableModel) getModel();
            if ((Boolean) model.getValueAt(row, model.findColumn("Select"))) {
                Side s = (Side) model.getValueAt(row, model.findColumn("Side"));
                if (s == Side.BUY)
                    c.setBackground(Color.BLUE);
                else
                    c.setBackground(Color.red);
            }
            else {
                c.setBackground(Color.white);
            }
            return c;
        }
    };

これは、ブール列値の選択に基づいて行の色が変わることを確認するためでした。私AbstractTableModelは次のように設定値メソッドを指定しました:

public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    assert columnIndex == 5;

    try{
        Selectable t = trades.get(rowIndex);
        t.setSelected((Boolean)aValue);
        fireTableDataChanged();
        //fireTableCellUpdated(rowIndex, columnIndex);
    }
    catch(Exception  e){
        throw new IllegalArgumentException("Object to set was not subtype of boolean");
    }

}

GUIのチェックボックスをクリックするfireTableDataChanged()と、色が更新されます。fireTableCellUpdated(rowIndex, columnIndex)ただし、他のハンドラーがセルの場所を知る必要があるため、本当に送信したいと思います。ただし、このシナリオでは、テーブル内の他の行をクリックした場合にのみ行が変更され、他のイベントが発生するのを遅らせて待っ​​ているかのように見えます。

なぜそうなるのですか?

4

2 に答える 2

2
  • 適切な方法で通知する必要があり、fireTableCellUpdated(row, col);

  • AbstractTableModel と prepareRenderer とそのメソッドの詳細については、コメントをお読みください@camickr

  • フィルタリングまたはソートさconvertXxxToModelれた場合を見てください、eiJTable

于 2012-08-02T16:22:48.940 に答える
2

すべてのリスナーに通知するには、 (見えない)TableModel必要があります。これを自動的に行います。でそうすべきです。そのようなリスナーの 1 つは、テーブル自体です。「他のハンドラーがセルの場所を知る必要がある」場合は、を介してインスタンスに登録できます。また、必要に応じてユーザー選択をリッスンすることもできます。fireTableXxxXxxx()DefaultTableModelAbstractTableModelsetValueAt()TableModelEventaddTableModelListener()

于 2012-08-02T18:33:13.027 に答える