1

ユーザーがJTable単一の行のみを選択できるようにする必要がありますが、ユーザーが行を選択するたびに、他の行 (何らかのロジックに従って関連付けられている行) もプログラムで選択する必要があります。問題は、テーブルの選択モードを に設定するとListSelectionModel.SINGLE_SELECTIONaddRowSelectionInterval1 行しか選択されないことです。何か案は?

編集: すべてのアイデア (カスタム選択モデル、最後のユーザー選択を除くすべてのクリア、強調表示用のカスタム レンダラー) は良かったと思いますが、SwingX を使用するのが最善です。これは、多くのインフラストラクチャ コードを必要とせず、図書館。(そして、SwingX の第一人者が助けてくれると、賢くなるのは簡単です :)

4

3 に答える 3

3

偏った私は言うでしょう:SwingXでは確かにはるかに簡単です:-)

あなたに必要なのは

  • 関連するものを決定するカスタムHighlightPredicate
  • selectionColorsで構成されたColorHighlighter
  • 選択モデルから変更通知を受信する際のカスタム述語を設定します

いくつかのコード:

// the custom predicate
public static class RelatedHighlightPredicate implements HighlightPredicate {
    List<Integer> related;

    public RelatedHighlightPredicate(Integer... related) {
        this.related = Arrays.asList(related);

    }
    @Override
    public boolean isHighlighted(Component renderer,
            ComponentAdapter adapter) {
        int modelIndex = adapter.convertRowIndexToModel(adapter.row);
        return related.contains(modelIndex);
    }

}

// its usage
JXTable table = new JXTable(someModel);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final ColorHighlighter hl = new ColorHighlighter(HighlightPredicate.NEVER, 
        table.getSelectionBackground(), table.getSelectionForeground());
table.addHighlighter(hl);
ListSelectionListener l = new ListSelectionListener() {

    @Override
    public void valueChanged(ListSelectionEvent e) {
        if (e.getValueIsAdjusting()) return;
        invokeUpdate((ListSelectionModel) e.getSource());
    }

    private void invokeUpdate(final ListSelectionModel source) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                int singleSelection = source.getMinSelectionIndex();
                if (singleSelection >= 0) {
                    int first = Math.max(0, singleSelection - 2);
                    int last = singleSelection + 2;
                    hl.setHighlightPredicate(new RelatedHighlightPredicate(first, last));
                } else {
                    hl.setHighlightPredicate(HighlightPredicate.NEVER);
                }
            }
        });

    }

};
table.getSelectionModel().addListSelectionListener(l);
于 2012-08-17T12:26:21.617 に答える
2

テーブルに複数選択を設定することもできますが、選択を変更するたびに、1行(最後に選択された行)のみを取得し、他の選択をクリアして、独自の計算された選択を追加します。

于 2012-08-17T10:36:09.300 に答える
2
  1. The problem is that if I set the selection mode of the table

    ListSelectionModel.SINGLE_SELECTIONから来たイベントにmouse使用するkeyborad

  2. some other rows (that are related according to some logic) should also be selected programmatically

    Renderer for JTableを見てから、必要な行、列、またはプログラムのルールが変更されない限り強調表示できるものは何でも

  3. ...多分あなたを助けるでしょう

于 2012-08-17T10:52:23.420 に答える