gpt4 book ai didi

java - 如何防止 JList 在单元格边界外进行选择?

转载 作者:搜寻专家 更新时间:2023-10-30 21:47:05 25 4
gpt4 key购买 nike

“有什么方法可以防止 JList 在用户单击列表下方的最后一个元素时选择最后一个元素吗?”

这是有人问的问题here 我有同样的问题。那个人找到了一个马马虎虎的解决方案(通过覆盖 processMouseEvent() ),但我想知道是否有更好/更优雅的方法来做到这一点。

[编辑]

好的,更详细一点。如果您有一个 JList 并且有一些空间未被任何单元格/元素占用,您单击该空间然后 JList 中的最后一个元素被选中。

对于一个真实的例子,试试这个 JList Swing Tutorial example , 单击空白区域 可以看到 Rollo 已被选中。

最佳答案

参见 https://forums.oracle.com/forums/thread.jspa?threadID=2206996

import java.awt.EventQueue;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;

public class TestJList {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JList list = new JList(new Object[] { "One", "Two", "Three" }) {
@Override
public int locationToIndex(Point location) {
int index = super.locationToIndex(location);
if (index != -1 && !getCellBounds(index, index).contains(location)) {
return -1;
}
else {
return index;
}
}
};

list.addMouseListener(new MouseAdapter() {

@Override
public void mouseClicked(MouseEvent e) {
JList list = (JList) e.getSource();
if (list.locationToIndex(e.getPoint()) == -1 && !e.isShiftDown()
&& !isMenuShortcutKeyDown(e)) {
list.clearSelection();
}
}

private boolean isMenuShortcutKeyDown(InputEvent event) {
return (event.getModifiers() & Toolkit.getDefaultToolkit()
.getMenuShortcutKeyMask()) != 0;
}
});

JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(new JScrollPane(list));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}

关于java - 如何防止 JList 在单元格边界外进行选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11138665/

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