当您按住控制键时,JList支持多项选择:按Ctrl +向上/向下移动一些不可见标记(nimbus LAF)。如果没有按空格,则会选择该元素。
示例:您的JList有三个元素,第一个元素被选中。你知道按Ctrl +向下,按Ctrl +向下然后按空格键。现在选择了最后一个元素。
问题是:如何使用Ctrl +向上/向下渲染我移动的不可见标记?
例如,windows文件资源管理器使用虚线边框呈现此标记,我喜欢渲染类似的东西。问题是,使用Ctrl +向上/向下键,您不会更改选择,但如果按空格键,则更改将被选中/取消选择的元素。
答案 0 :(得分:2)
DefaultListCellRenderer
使用特殊边框自动执行此操作。如果您想更改此边框,可以在UIManager
中更改L& F的相应设置。
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.StrokeBorder;
public class ListTryout {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
UIManager.put("List.focusCellHighlightBorder", BorderFactory.createDashedBorder(Color.GRAY));
final JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.add(new JScrollPane(new JList<String>(new String[] {"one", "two", "three"})));
f.pack();
f.setVisible(true);
}
});
}
}
如果您想做其他事情,可以编写自己的渲染器。
import java.awt.Color;
import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class ListTryout {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// UIManager.put("List.focusCellHighlightBorder", new StrokeBorder(new BasicStroke(2f)));
final JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JList<String> l = new JList<String>(new String[] {"one", "two", "three"});
l.setCellRenderer(new MyRenderer());
f.add(new JScrollPane(l));
f.pack();
f.setVisible(true);
}
});
}
private static class MyRenderer extends DefaultListCellRenderer {
/**
* {@inheritDoc}
*/
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component result = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (!isSelected && cellHasFocus) { // custom highlight of focused but not-selected cell
result.setBackground(Color.LIGHT_GRAY);
((JComponent) result).setBorder(null);
}
return result;
}
}
}