JList - 设置允许的选择组合
JList - set allowed selection combinations
我有一个包含 8 个字符串项的 JList
。客户希望有四种可能的选择组合。代码示例生成这样的列表。我用鼠标监听器以一种丑陋的方式部分地完成了这个。
import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.util.ArrayList;
class Selections {
public static void main(String[] args) throws Exception {
ArrayList<String> items = new ArrayList<String>();
items.add("11");
items.add("21");
items.add("31");
items.add("41");
items.add("12");
items.add("22");
items.add("32");
items.add("42");
final ArrayList<String> combinationOne = new ArrayList<String>();
combinationOne.add("11");
combinationOne.add("12");
final ArrayList<String> combinationTwo = new ArrayList<String>();
combinationTwo.add("21");
combinationTwo.add("22");
final ArrayList<String> combinationThree = new ArrayList<String>();
combinationThree.add("31");
combinationThree.add("32");
final ArrayList<String> combinationFour = new ArrayList<String>();
combinationFour.add("41");
combinationFour.add("42");
JList list = new JList(items.toArray());
MouseListener mouseListener = new MouseAdapter() {
public void mouseReleased(MouseEvent mouseEvent) {
JList eventList = (JList) mouseEvent.getSource();
int index = eventList.locationToIndex(mouseEvent.getPoint());
if (index >= -1) {
Object o = eventList.getModel().getElementAt(index);
System.out.println(o.toString());
if (combinationOne.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(0, 0);
eventList.addSelectionInterval(4, 4);
} else if (combinationTwo.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(1, 1);
eventList.addSelectionInterval(5, 5);
} else if(combinationThree.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(2, 2);
eventList.addSelectionInterval(6, 6);
} else if (combinationFour.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(3, 3);
eventList.addSelectionInterval(7, 7);
}
}
}
};
list.addMouseListener(mouseListener);
list.setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
// Set the default selection
list.addSelectionInterval(0, 0);
list.addSelectionInterval(4, 4);
JOptionPane.showMessageDialog(null, new JScrollPane(list));
}
}
此实现存在一些问题:
选择从鼠标点击开始,但是第二次选择发生在鼠标松开之后。这会造成不一致的印象。
您还会看到在鼠标松开后第二个项目的选择有一个短暂的延迟。
第二个选择的项目周围设置了边框,这是不需要的。
您可以使用箭头 up/down 在项目之间移动,这是未处理的。
此外,我不喜欢这种实现方式,因为它不干净。
我试过 ListSelectionListener
但我无法避免选择事件循环,它溢出了。
看这个没有第4点
class Selections{
ArrayList<String> items = new ArrayList<String>();
final ArrayList<String> combinationOne = new ArrayList<String>();
final ArrayList<String> combinationTwo = new ArrayList<String>();
final ArrayList<String> combinationThree = new ArrayList<String>();
final ArrayList<String> combinationFour = new ArrayList<String>();
JList list = null;
public Selections(){
items.add("11");
items.add("21");
items.add("31");
items.add("41");
items.add("12");
items.add("22");
items.add("32");
items.add("42");
list = new JList(items.toArray());
combinationOne.add("11");
combinationOne.add("12");
combinationTwo.add("21");
combinationTwo.add("22");
combinationThree.add("31");
combinationThree.add("32");
combinationFour.add("41");
combinationFour.add("42");
}
public static void main(String[] args) throws Exception {
Selectionsselections = new Selections();
selections.runApp();
}
private void runApp() {
MouseMotionListener mouseMotionListener = new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
JList eventList = (JList) e.getSource();
addSelectionInterval(eventList);
}
};
MouseListener mouseListener = new MouseAdapter() {
public void mousePressed(MouseEvent mouseEvent) {
JList eventList = (JList) mouseEvent.getSource();
int index = eventList.locationToIndex(mouseEvent.getPoint());
if (index >= -1) {
addSelectionInterval(eventList);
}
}
};
list.addMouseListener(mouseListener);
list.addMouseMotionListener(mouseMotionListener );
list.setCellRenderer(getRenderer());
list.setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
// Set the default selection
list.addSelectionInterval(0, 0);
list.addSelectionInterval(4, 4);
JOptionPane.showMessageDialog(null, new JScrollPane(list));
}
private void addSelectionInterval(JList eventList) {
if (combinationOne.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(0, 0);
eventList.addSelectionInterval(4, 4);
} else if (combinationTwo.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(1, 1);
eventList.addSelectionInterval(5, 5);
} else if(combinationThree.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(2, 2);
eventList.addSelectionInterval(6, 6);
} else if (combinationFour.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(3, 3);
eventList.addSelectionInterval(7, 7);
}
}
private ListCellRenderer<? super String> getRenderer() {
return new DefaultListCellRenderer(){
@Override
public Component getListCellRendererComponent(JList<?> list,
Object value, int index, boolean isSelected,
boolean cellHasFocus) {
JLabel listCellRendererComponent = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected,cellHasFocus);
listCellRendererComponent.setBorder(BorderFactory.createEmptyBorder());
return listCellRendererComponent;
}
};
}
}
我有一个包含 8 个字符串项的 JList
。客户希望有四种可能的选择组合。代码示例生成这样的列表。我用鼠标监听器以一种丑陋的方式部分地完成了这个。
import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.util.ArrayList;
class Selections {
public static void main(String[] args) throws Exception {
ArrayList<String> items = new ArrayList<String>();
items.add("11");
items.add("21");
items.add("31");
items.add("41");
items.add("12");
items.add("22");
items.add("32");
items.add("42");
final ArrayList<String> combinationOne = new ArrayList<String>();
combinationOne.add("11");
combinationOne.add("12");
final ArrayList<String> combinationTwo = new ArrayList<String>();
combinationTwo.add("21");
combinationTwo.add("22");
final ArrayList<String> combinationThree = new ArrayList<String>();
combinationThree.add("31");
combinationThree.add("32");
final ArrayList<String> combinationFour = new ArrayList<String>();
combinationFour.add("41");
combinationFour.add("42");
JList list = new JList(items.toArray());
MouseListener mouseListener = new MouseAdapter() {
public void mouseReleased(MouseEvent mouseEvent) {
JList eventList = (JList) mouseEvent.getSource();
int index = eventList.locationToIndex(mouseEvent.getPoint());
if (index >= -1) {
Object o = eventList.getModel().getElementAt(index);
System.out.println(o.toString());
if (combinationOne.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(0, 0);
eventList.addSelectionInterval(4, 4);
} else if (combinationTwo.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(1, 1);
eventList.addSelectionInterval(5, 5);
} else if(combinationThree.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(2, 2);
eventList.addSelectionInterval(6, 6);
} else if (combinationFour.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(3, 3);
eventList.addSelectionInterval(7, 7);
}
}
}
};
list.addMouseListener(mouseListener);
list.setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
// Set the default selection
list.addSelectionInterval(0, 0);
list.addSelectionInterval(4, 4);
JOptionPane.showMessageDialog(null, new JScrollPane(list));
}
}
此实现存在一些问题:
选择从鼠标点击开始,但是第二次选择发生在鼠标松开之后。这会造成不一致的印象。
您还会看到在鼠标松开后第二个项目的选择有一个短暂的延迟。
第二个选择的项目周围设置了边框,这是不需要的。
您可以使用箭头 up/down 在项目之间移动,这是未处理的。
此外,我不喜欢这种实现方式,因为它不干净。
我试过 ListSelectionListener
但我无法避免选择事件循环,它溢出了。
看这个没有第4点
class Selections{
ArrayList<String> items = new ArrayList<String>();
final ArrayList<String> combinationOne = new ArrayList<String>();
final ArrayList<String> combinationTwo = new ArrayList<String>();
final ArrayList<String> combinationThree = new ArrayList<String>();
final ArrayList<String> combinationFour = new ArrayList<String>();
JList list = null;
public Selections(){
items.add("11");
items.add("21");
items.add("31");
items.add("41");
items.add("12");
items.add("22");
items.add("32");
items.add("42");
list = new JList(items.toArray());
combinationOne.add("11");
combinationOne.add("12");
combinationTwo.add("21");
combinationTwo.add("22");
combinationThree.add("31");
combinationThree.add("32");
combinationFour.add("41");
combinationFour.add("42");
}
public static void main(String[] args) throws Exception {
Selectionsselections = new Selections();
selections.runApp();
}
private void runApp() {
MouseMotionListener mouseMotionListener = new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
JList eventList = (JList) e.getSource();
addSelectionInterval(eventList);
}
};
MouseListener mouseListener = new MouseAdapter() {
public void mousePressed(MouseEvent mouseEvent) {
JList eventList = (JList) mouseEvent.getSource();
int index = eventList.locationToIndex(mouseEvent.getPoint());
if (index >= -1) {
addSelectionInterval(eventList);
}
}
};
list.addMouseListener(mouseListener);
list.addMouseMotionListener(mouseMotionListener );
list.setCellRenderer(getRenderer());
list.setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
// Set the default selection
list.addSelectionInterval(0, 0);
list.addSelectionInterval(4, 4);
JOptionPane.showMessageDialog(null, new JScrollPane(list));
}
private void addSelectionInterval(JList eventList) {
if (combinationOne.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(0, 0);
eventList.addSelectionInterval(4, 4);
} else if (combinationTwo.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(1, 1);
eventList.addSelectionInterval(5, 5);
} else if(combinationThree.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(2, 2);
eventList.addSelectionInterval(6, 6);
} else if (combinationFour.contains(eventList.getSelectedValue())) {
eventList.addSelectionInterval(3, 3);
eventList.addSelectionInterval(7, 7);
}
}
private ListCellRenderer<? super String> getRenderer() {
return new DefaultListCellRenderer(){
@Override
public Component getListCellRendererComponent(JList<?> list,
Object value, int index, boolean isSelected,
boolean cellHasFocus) {
JLabel listCellRendererComponent = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected,cellHasFocus);
listCellRendererComponent.setBorder(BorderFactory.createEmptyBorder());
return listCellRendererComponent;
}
};
}
}