私は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指名のためのArrayListやHashMapのにちょうど
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;
}
}
優秀!本当にありがとうございます - これは完全に動作しますが、私はそれを理解し、それを実際のものに適応させるために少し勉強しています。とても有難い! – regger