2

2 つの JList コンポーネントに問題があります。

JFrame に 2 つの JList コンポーネントを作成して配置しました。私は listSelectionListeners を両方に追加しました。これは、他の JList の選択を次のように選択解除する必要があります: (編集: 要求された自己完結型のサンプルとして作成するには)


public class JListIssue {

     public static void main(String[] args) {
          JFrame frame = new JFrame();
          JPanel mainPanel = new JPanel();
          frame.setContentPane(mainPanel);

          final JList jList1 = new JList();
          mainPanel.add(jList1);
          final JList jList2 = new JList();
          mainPanel.add(jList2);

          // Setting up models for both JList components to display example values
          jList1.setModel(new AbstractListModel() {
            String[] items = {"Item 1", "Item 2", "Item 3"};
            public int getSize() { return items.length; }
            public Object getElementAt(int i) { return items[i]; }
          });

          jList2.setModel(new AbstractListModel() {
            String[] items = {"Item 1", "Item 2", "Item 3"};
            public int getSize() { return items.length; }
            public Object getElementAt(int i) { return items[i]; }
          });


          // Adding listeners
          jList1.addListSelectionListener(new ListSelectionListener() {

               public void valueChanged(ListSelectionEvent e) {
                    jList2.clearSelection();
               }
          });

          jList2.addListSelectionListener(new ListSelectionListener() {

               public void valueChanged(ListSelectionEvent e) {
                    jList1.clearSelection();
               }
          });

          frame.pack();
          frame.setVisible(true);
     }
}

ただし、これら 2 つのリストのいずれかの選択を解除すると、2 回クリックして新しい選択を行う必要があります。初めてクリックすると、選択したい項目が実際には選択されないので(listSelectionListenerで確認)、最初の選択中にマウスの左ボタンを押したままマウスを移動するか、2回目にクリックする必要がありますそして実際にアイテムを選択します。

私はこの振る舞いが奇妙だと思うので、このように振る舞いたくありません。なにか提案を?

4

2 に答える 2

1

イベント variableにアクセスできます。これは、この現在のイベントが一連の複数のイベントであるかどうかを示すことができますgetValueIsAdjusting()

public void valueChanged(ListSelectionEvent e) {
    if (e.getValueIsAdjusting())
       jList1.clearSelection();
}
于 2011-11-08T00:59:07.990 に答える
1

あなたの問題は、他のリストからの clearSelection() 呼び出しに応答して ListSelectionListener が通知されることです。jlist1 で選択を行うと、jlist2 で clearSelection が呼び出されます。jlist2 で何かが選択されている場合、jlist2 の選択リスナーで valueChanged がトリガーされ、jlist1 で行ったばかりの選択がクリアされます。おそらく、2 つのリスナーが現在変更中かどうかを 2 つのリスナーに知らせるフラグを追加する必要があります。

//member variable
boolean isChanging = false;

//later.... make this same change in both ListSelectionListeners!
jList2.addListSelectionListener(new ListSelectionListener() {

 public void valueChanged(ListSelectionEvent e) {
      if (!isChanging) {
        isChanging = true;
        jList1.clearSelection();
        isChanging = false;
      }
 }

});

于 2010-07-23T14:34:10.203 に答える