1

私はJTableカスタムレンダラーを持っています。のアイテムJTableがクリックされると、モデルに影響を与える特定の一連のアクションを実行します。これを実装するには、次の 2 つの選択肢があります。

ListSelectionListenerJTable :行がクリックされたとき に起動するリスナーを全体に追加します。次に、アクションを実行します。

  • 利点: 行の任意の部分を選択できます (私の場合は必要ありません)。これはおそらく、Swingがイベントを発生させることを意図した方法です。JTable
  • 短所: これを処理してコードを再現するには、カスタム クラスを作成する必要があります。

例:

class Selector implements ListSelectionListener {
    @Override
    public void valueChanged(ListSelectionEvent event) {
        // ... write the action code here
    }
}

JButton & Action : をレンダリングし、JButtonそれに を追加ActionJButtonます。

  • 利点: を再利用できます。Action変更するとAction、それを使用するすべてのインスタンスが更新されます。
  • 短所: ロジックをレンダリング コードに移動します。

例:

class Renderer implements TableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
                        boolean isSelected, boolean hasFocus, int row, int col) {
        JButton btn = new JButton(value.toString());
        btn.setAction(new SpecificAction());
        return btn;
    }
}
  1. 2 番目の解決策を使用すると、天から火の雨が降りますか?

  2. どちらも同じように実行可能ですか?

  3. Action内で sを使用する方法はありListSelectionListenerますか?

4

1 に答える 1

2

あなたの特定のユースケースの知識がなくても、ここに私の考えがあります:

1)ListSelectionListenerは使用しません。一部のユーザーは、矢印キーを使用してテーブルをスクロールする傾向があります。ユーザーが矢印キーで「スクロール」しているという理由だけでリスナーを起動させたくありません。しかし、私はこれをいくつかの特定の、あまり一般的でない状況に使用しました。

2)レンダラーを使用してセルにJButtonを表示し、テーブルにMouseListenerを追加します。座標をmouseClickedイベントからテーブルセルに変換します。セルにButtonRendererがある場合は、適切なコードを実行します。特定のセルをクリックすることはユーザーによる意図的なアクションである可能性が高いため、これにより不要なアクションが除外される可能性が高くなります。

編集:

RobCamickのサイトからの解決策は次のとおりです。テーブルボタンの列

そして、ここでそれについての短い議論:JTableへのボタンの追加

于 2013-02-19T19:02:38.887 に答える