2016-10-28 5 views
0

私は2つのJListsを持っています。リストAで項目を選択すると、リストBで1つ以上の関連項目が強調表示されます。単純な例では、リスト1にAB、AC、BC、ABCがあります。リスト2にA、B、Cがあります。リスト1でACが選択されている場合は、リスト2などでAとCを強調します。Java - JList 1での選択に基づいて、JList 2でアイテムを選択するにはどうすればよいですか?

ListSelectionListenerとListCellRendererを完全に誤って処理しています。私の考えでした:のListSelectionListenerで

  1. リスト1指名のためのArrayListやHashMapのにちょうど

  2. LIST2を行い、リスト1で選択したものに基づいて強調表示されます、リスト2でどのようなアイテム。従ってこれが動作しない1.

リストについてのListSelectionListenerで指定した内容に基づいて、青色又は白色の背景を設定するリスト2 ListCellRendererにおけるロジックとリスト1のListSelectionListenerから)(再描画しかし、私が間違って実装しているか、それが間違ったアプローチであることが原因であるかどうかはわかりません。

アイデア?どうもありがとうございます...

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.ListCellRenderer; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class Test extends JFrame { 
    public static JList list1, list2; 
    public static DefaultListModel model1, model2; 
    public static List<Integer> highlightThese = new ArrayList<Integer>(); 


    public Test() { 
    setPreferredSize(new Dimension(300, 100)); 
    Container cp = getContentPane(); 
    cp.setLayout(new FlowLayout()); 

    list1 = new JList(); 
    list1.setModel(new ListModel1()); 
    model1 = new DefaultListModel(); 
    list1.addListSelectionListener(new ListenerForList1()); 
    cp.add(list1); 

    list2 = new JList(new String[] {"A", "B", "C"}); 
    model2 = new DefaultListModel(); 
    cp.add(list2); 

    pack(); 
    } 

    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     new Test().setVisible(true); 
     } 
    }); 
    } 
} 

class ListModel1 extends DefaultListModel { 
    String[] listItems = new String[] { "AB", "AC", "BC", "ABC" }; 

    public ListModel1() { 
    for (int i = 0; i < listItems.length; i++) { 
     addElement(listItems[i]); 
    } 
    } 
} 

class ListModel2 extends DefaultListModel { 
    String[] listItems = new String[] { "A", "B", "C" }; 

    public ListModel2() { 
    for (int i = 0; i < listItems.length; i++) { 
     addElement(listItems[i]); 
    } 
    } 
} 

class ListenerForList1 implements ListSelectionListener { 
    @Override 
    public void valueChanged(ListSelectionEvent e) { 
    JList list = (JList)(e.getSource()); 
    Object[] tmp = list.getSelectedValues(); 
    String[] selectedValues1 = Arrays.copyOf(tmp, tmp.length, String[].class); 

    for (int i = 0; i < selectedValues1.length; i++) { 
     String l1Val = selectedValues1[i]; 
     for (int j = 0; j < Test.model2.getSize(); j++) { 
     String l2Val = (String)(Test.model2.get(j)); 
     if (l1Val.indexOf(l2Val) >= 0) { 
      // Want to highlight item j in list2 here, or at least 
      // designate somehow that it should be highlighted (in 
      // TestRenderer2?). Must also handle turning off highlight 
      // at some point but will deal with that later. 
      Test.highlightThese.add(j); 
     } 
     } 
    } 
    list2.repaint(); 
    } 
} 

class TestRenderer2 extends JLabel implements ListCellRenderer { 
    @Override 
    public Component getListCellRendererComponent(JList list, Object stringval, int inx, boolean isSelected, boolean cellHasFocus) { 
    if (Test.highlightThese.contains(inx)) { 
     setBackground(Color.BLUE); 
     setForeground(Color.WHITE); 
    } else { 
     setBackground(Color.WHITE); 
     setForeground(Color.BLACK); 
    } 
    return this; 
    } 
} 

答えて

1

ListSelectionModel.MULTIPLE_INTERVAL_SELECTIONへの第二のリストから変更ListSelectionMode。最初のモデルを繰り返し、addSelectionIntervalを使用してください。試してみてください

import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.ListSelectionModel; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 
public class Test extends JFrame { 
    public JList<String> list1, list2; 
    public DefaultListModel<String> model1, model2; 
    public List<Integer> highlightThese = new ArrayList<Integer>(); 
    public Test() { 
     setPreferredSize(new Dimension(300, 100)); 
     Container cp = getContentPane(); 
     cp.setLayout(new FlowLayout()); 
     model1 = new DefaultListModel<String>(); 
     model1.addElement("AB"); 
     model1.addElement("AC"); 
     model1.addElement("BC"); 
     model1.addElement("ABC"); 
     list1 = new JList<String>(model1); 
     list1.addListSelectionListener(new ListSelectionListener() { 
      @Override 
      public void valueChanged(ListSelectionEvent e) { 
       list2.clearSelection(); 
       String str = list1.getSelectedValue(); 
       String[] parts = str.split(""); 
       for (int i = 0; i < model2.size(); i++) { 
        for (String p : parts) { 
         if (model2.getElementAt(i).equals(p)) 
          list2.addSelectionInterval(i, i); 
        } 
       } 
      } 
     }); 
     cp.add(list1); 
     model2 = new DefaultListModel<String>(); 
     model2.addElement("A"); 
     model2.addElement("B"); 
     model2.addElement("C"); 
     list2 = new JList<String>(model2); 
     list2.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
     cp.add(list2); 
     pack(); 
    } 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Test().setVisible(true); 
      } 
     }); 
    } 
} 
+0

優秀!本当にありがとうございます - これは完全に動作しますが、私はそれを理解し、それを実際のものに適応させるために少し勉強しています。とても有難い! – regger

関連する問題