0

JTable独自のセル レンダラーとセル エディターを備えた を使用します。

このテーブルには 2 つの列と x 行が含まれていると
します。最初の列にはブール値、独自のセル レンダリングおよびセル エディター (ラジオボタン)
が含まれています。2 番目の列には文字列値、独自のセル レンダラーが含まれています。現在の行の列が true に設定されている (ラジオボタンがオンになっている)

すべての値はエディターによって正しく更新されますが、ラジオ ボタンが true に設定されている場合、2 行目は太字になりません...
変更を確認するには、別の行のラジオ ボタンをチェックする必要があります

これらの変更はどこで実行できますか?

乾杯とあなたの助けに感謝します


RadiobuttonTableCellEditor.java

public class RadiobuttonTableCellEditor extends DefaultCellEditor
                                    implements ItemListener {
JRadioButton rb = new JRadioButton();

public RadiobuttonTableCellEditor(JCheckBox pCheckBox) {
    super(pCheckBox);
}

public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    if (value == null)
        return null;
    rb.addItemListener(this);
    rb.setSelected((Boolean)value);
    return rb;
}

public void itemStateChanged(ItemEvent e) {
    super.fireEditingStopped();
}

public Object getCellEditorValue() {
    rb.removeItemListener(this);
    return rb.isSelected();
}
}
4

3 に答える 3

1

テーブルモデルでは、値が変更されるたびに適切なイベントを発生させる必要があります。モデルがから継承されAbstractTableModelている場合は、いくつかの方法を使用できますfireXXX。私の推測では、setValueAtメソッドからそれらを呼び出す必要があります。

正確な列と行がわかっている場合は、を呼び出すことができます。そうでない場合は、別の列を更新する必要があるため、fireTableCellUpdatedおそらく使用する必要があります。fireTableChanged

そしてもちろん、レンダラーは新しい値を適切にレンダリングする必要があります。

于 2009-05-28T04:18:04.567 に答える
0

同様の問題を抱えている人々を助けることができると思いますtrue。ラジオボタンを連続して一意にします。その動作、特にメソッドDefaultTableModelを変更するには、を拡張する必要がありますsetValueAt

乾杯


/**
 * When <code>column</code> is the column that contains the Boolean (in fact the radio button):
 * If aValue == false and that it had a previous value set to true we don't do anything
 * If aValue == true and that it had a previous value set to false, we set all the other booleans to false and this one to true
 */
@Override
public void setValueAt(Object aValue, int row, int column) {
    if (column == colonneBoutonradio)
    {
        if (((Boolean)aValue && !(Boolean)super.getValueAt(row, column)))
            for (int i = 0; i < this.getRowCount(); i++)
                // i==row permet de vérifier si la ligne courante est celle à modifier (et donc celle à mettre à true)
                super.setValueAt(i==row, i, colonneBoutonradio);
    }
    else
        super.setValueAt(aValue, row, column);
}
于 2009-05-28T13:44:25.647 に答える
0

そこまで延長しても意味がないようですDeafultCellEditor。そのようなリスナー インターフェイスを実装することも、良い考えではありません。

レンダラーは、薄いレイヤーとして最適に機能します。別のセルを変更する必要がある場合は、関連する更新イベントを発生させるテーブル モデルに反映する必要があります。

于 2009-05-27T18:47:22.897 に答える