JList呈现不可见的“选择标记”

时间:2016-04-19 09:32:07

标签: java swing jlist

当您按住控制键时,JList支持多项选择:按Ctrl +向上/向下移动一些不可见标记(nimbus LAF)。如果没有按空格,则会选择该元素。

示例:您的JList有三个元素,第一个元素被选中。你知道按Ctrl +向下,按Ctrl +向下然后按空格键。现在选择了最后一个元素。

问题是:如何使用Ctrl +向上/向下渲染我移动的不可见标记?

例如,windows文件资源管理器使用虚线边框呈现此标记,我喜欢渲染类似的东西。问题是,使用Ctrl +向上/向下键,您不会更改选择,但如果按空格键,则更改将被选中/取消选择的元素。

1 个答案:

答案 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;
        }
    }
}