gpt4 book ai didi

java - findComponentAt 返回 JList 的 self

转载 作者:行者123 更新时间:2023-11-30 03:59:41 27 4
gpt4 key购买 nike

好的,所以我认为我的问题源于对 JList 实际上 的作用缺乏根本性的理解。

我有一个简单的示例类MyList

package test;

import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;

public class MyList extends JList<String> {
public MyList(Vector<String> myStrings){
super(myStrings);
this.setCellRenderer(new ListCellRenderer<String>(){
@Override
public Component getListCellRendererComponent(
JList<? extends String> list, String value, int index,
boolean isSelected, boolean cellHasFocus) {
String myString = value.toString();
return new JLabel(myString+" (idx "+index+")");
}

});

this.addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent e) {
MyList p = (MyList) e.getSource();
Component c = p.findComponentAt(e.getX(), e.getY());
System.out.println("am clicking on "+c.getClass()+" in "+p.getClass());
}
});
}

public static void main(String[] args){
Vector<String> myStrings = new Vector<String>();
myStrings.addAll(Arrays.asList("str 1","str 2","str 3"));
MyList mine = new MyList(myStrings);
JFrame myFrame = new JFrame();
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setSize(500, 500);
myFrame.add(mine);
myFrame.setVisible(true);
}
}

单击列表中的任何 JLabel 的输出是相同的:

am clicking on class test.MyList in class test.MyList

我预计它是:

am clicking on class javax.swing.JLabel in class test.MyList

我认为这与 ListCellRenderer 的工作方式有关,但我不确定。为什么我从 p.findComponentAt(e.getX(), e.getY()); 返回的组件不是 JLabel?这是怎么回事?

最佳答案

Why isn't the component I get back from p.findComponentAt(e.getX(), e.getY()); a JLabel? What is going on here?

JList 和 JTables 付出了额外的努力来高效显示大量信息,同时最大限度地减少开销。他们做到这一点的一种方法是通过渲染器显示信息。您在 JList 中看到的不是真正的 JLabels,而是 JLabels 的图像(或用作渲染器的任何组件)。 JList 使用相同的渲染器为列中的每个元素创建图像。假设您有一个包含 1000 个项目的 JList,而不是创建 1000 个 JLabel,JList 只创建一个,使用它创建 JLabel 图像,然后显示图像。因此,您单击的实际上是 JList,而不是 JLabel。

要进一步测试这一点,请尝试使用 JTextField 作为渲染器,您很快就会发现该单元格的行为与 JTextField 不同,并且您无法编辑它显示的信息。

关于java - findComponentAt 返回 JList 的 self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22281834/

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