gpt4 book ai didi

java - JList渲染不可见 "selection marker"

转载 作者:行者123 更新时间:2023-12-02 03:42:19 26 4
gpt4 key购买 nike

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

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

问题是:如何渲染通过 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;
}
}
}

关于java - JList渲染不可见 "selection marker",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36714318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com