代码之家  ›  专栏  ›  技术社区  ›  MirroredFate

findComponentAt为JList返回自身

  •  1
  • MirroredFate  · 技术社区  · 11 年前

    好的,所以我认为我的问题源于对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?这是怎么回事?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Hovercraft Full Of Eels    11 年前

    为什么我没有从p.findComponentAt(e.getX(),e.getY())获取组件;一个JLabel?这是怎么回事?

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

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