JList渲染不可见“选择标记”
问题描述:
当您按住控制键时,JList支持多种选择:按Ctrl +向上/向下移动某个不可见标记(nimbus LAF)。如果你没有按空格,元素被选中。JList渲染不可见“选择标记”
示例:您的JList有三个元素,第一个元素被选中。你知道按Ctrl + Down,Ctrl + Down和Space。现在选择了最后一个元素。
现在的问题是:我如何渲染不可见的标记,我用Ctrl +向上/向下移动?
例如,Windows文件浏览器渲染带有虚线边框的标记,我喜欢渲染类似的东西。事情是,按Ctrl +向上/向下,你不改变选择,但你改变将被选择/取消选择,如果你按空格的元素。
答
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;
}
}
}