[英]Java - How do I select items in JList 2 based on selection in JList 1?
I have two JLists. 我有两个JList。 When I select an item in list AI want one or more related items to be highlighted in list B. Simple case here has list 1 with AB, AC, BC, and ABC; 当我在列表AI中选择一个项目时,希望在列表B中突出显示一个或多个相关项目。简单的情况是列表1中包含AB,AC,BC和ABC; list 2 has A, B, and C. If AC is selected in list 1 I want A and C to be highlighted in list 2, etc. 列表2具有A,B和C。如果在列表1中选择了AC,我希望在列表2中突出显示A和C,依此类推。
I'm completely mishandling the ListSelectionListener and ListCellRenderer. 我完全错误地处理了ListSelectionListener和ListCellRenderer。 My idea was: 我的想法是:
In the ListSelectionListener for list 1 designate in an ArrayList or HashMap what items in list 2 should be highlighted based on what was just selected in list 1. 在列表1的ListSelectionListener中,在ArrayList或HashMap中指定应基于列表1中刚刚选择的内容突出显示列表2中的哪些项目。
Do a list2.repaint() from the list 1 ListSelectionListener with the logic in the ListCellRenderer for list 2 setting the background to blue or white accordingly based on what was designated in the ListSelectionListener for list 1. 使用列表2的ListCellRenderer中的逻辑,执行列表1 ListSelectionListener中的list2.repaint(),根据列表1的ListSelectionListener中指定的内容,将背景相应地设置为蓝色或白色。
This doesn't work, but I don't know if it's because I'm implementing it incorrectly or because it's the wrong approach altogether. 这是行不通的,但是我不知道这是因为我执行不正确还是因为它完全是错误的方法。
Any ideas? 有任何想法吗? Thanks very much… 非常感谢…
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;
}
}
Change ListSelectionMode
from second list to ListSelectionModel.MULTIPLE_INTERVAL_SELECTION
. 将ListSelectionMode
从第二个列表更改为ListSelectionModel.MULTIPLE_INTERVAL_SELECTION
。 Iterate over first model and use addSelectionInterval
. 遍历第一个模型并使用addSelectionInterval
。 Try this 尝试这个
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);
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.