2016-10-28 2 views
0

두 개의 JLists가 있습니다. 목록 A에서 항목을 선택하면 하나 이상의 관련 항목이 목록 B에서 강조 표시됩니다. 여기에 간단한 경우 AB, AC, BC 및 ABC가있는 목록 1이 있습니다. 목록 2에는 A, B 및 C가 있습니다. 목록 1에서 AC를 선택한 경우 목록 2 등에서 A와 C를 강조 표시합니다.Java - JList 1의 선택에 따라 JList 2에서 항목을 어떻게 선택합니까?

ListSelectionListener 및 ListCellRenderer가 완전히 처리되지 않습니다. 내 생각이었다 다음 ListSelectionListener에에서

  1. 목록 1 지명자에 대한 ArrayList에 또는 HashMap의 단지

  2. 리스트 2를 수행 목록 1에서 선택한 내용에 따라 강조한다 목록 2에서 어떤 항목이 없습니다. 이에 따라 목록 1.

이 작동하지 않습니다에 대한 ListSelectionListener에에 지정되었다 내용에 따라 파란색 또는 흰색의 배경을 설정 목록이의의 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