来自acm java库(GraphicsProgram)的getElementAt(双x,双y)的java eq值是多少;

来自acm java库(GraphicsProgram)的getElementAt(双x,双y)的java eq值是多少;,java,swing,jframe,jcomponent,Java,Swing,Jframe,Jcomponent,在java中,我尝试使用容器类中的getComponentAt(x,y)方法。但对于给定的(x,y)坐标,它总是返回类javax.swing.JRootPane的me对象,即使(x,y)包含一些image/JLabel/JButton import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import javax.swing.JFrame; publi

在java中,我尝试使用容器类中的getComponentAt(x,y)方法。但对于给定的(x,y)坐标,它总是返回类javax.swing.JRootPane的me对象,即使(x,y)包含一些image/JLabel/JButton

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class temp2 implements MouseListener{
    public static void main(String[] arg){
        frame = new JFrame("adsa");
        frame.setBounds(0, 0, 1000, 1000);
        frame.setVisible(true);
        frame.addMouseListener(new temp2());
        JButton l = new JButton("asdasd");
        frame.add(l);
        l.addMouseListener(new temp2());;
    }
    static JFrame frame;
    @Override
    public void mouseClicked(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
            System.out.println(frame.getComponentAt(x, y).getClass());
        System.out.println(frame.getComponentAt(x, y) instanceof JButton);

    }
    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

}
这是我用于测试的示例代码。。 每当我点击按钮时,我都会得到以下输出:

class javax.swing.JRootPane 
false

这取决于您如何构建UI,但请尝试
Container\findcomponentat(int x,int y)
-它返回最可见的子级。

这取决于您如何构建UI,但请尝试
Container\findcomponentat(int x,int y)
-它返回最可见的子级。

例如,您必须查找

导入java.awt.Component;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.*;
公共类TestMouseListener{
公共静态void main(字符串[]args){
最终JComboBox组合=新JComboBox();
combo.setEditable(真);
对于(int i=0;i<10;i++){
附加项组合(i);
}
最终JLabel提示=新JLabel();
提示:setText(“外部组合框”);
JPanel面板=新的JPanel();
面板。添加(组合);
面板。添加(提示);
panel.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标事件(鼠标事件e){
提示:setText(“外部组合框”);
}
@凌驾
公共无效mouseExited(MouseEvent e){
组件c=SwingUtilities.GetDeepTestComponentAT(
e、 getComponent(),e.getX(),e.getY());
tip.setText(c!=null&&SwingUtilities.isDescendingFrom(
c、 组合)?“内部组合框”:“外部组合框”);
}
});
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
框架。添加(面板);
frame.pack();
frame.setVisible(true);
}
私人TestMouseListener(){
}
}
例如,您必须查找

导入java.awt.Component;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.*;
公共类TestMouseListener{
公共静态void main(字符串[]args){
最终JComboBox组合=新JComboBox();
combo.setEditable(真);
对于(int i=0;i<10;i++){
附加项组合(i);
}
最终JLabel提示=新JLabel();
提示:setText(“外部组合框”);
JPanel面板=新的JPanel();
面板。添加(组合);
面板。添加(提示);
panel.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标事件(鼠标事件e){
提示:setText(“外部组合框”);
}
@凌驾
公共无效mouseExited(MouseEvent e){
组件c=SwingUtilities.GetDeepTestComponentAT(
e、 getComponent(),e.getX(),e.getY());
tip.setText(c!=null&&SwingUtilities.isDescendingFrom(
c、 组合)?“内部组合框”:“外部组合框”);
}
});
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
框架。添加(面板);
frame.pack();
frame.setVisible(true);
}
私人TestMouseListener(){
}
}

问题来自这样一个事实:您正在将侦听器添加到多个组件中,但您总是引用框架来检索组件。你应该做的是:

Component c = ((Component)e.getSource()).getComponentAt(e.getX(), e.getY());
// Do some stuff about c.

事件坐标是相对于触发事件的组件的。

问题源于这样一个事实,即您正在将侦听器添加到多个组件中,但您总是参考帧来检索组件。你应该做的是:

Component c = ((Component)e.getSource()).getComponentAt(e.getX(), e.getY());
// Do some stuff about c.

事件坐标相对于触发事件的组件。

getComponentAt(x,y)应该执行您试图执行的操作,因此代码有问题。我担心如果没有一些小的代码示例来演示这个问题,您将不会得到太多帮助。@Guillaume Polet通过add
Component c=SwingUtilities.getDeepTestComponentAt(…
,and
System.out.println(c);
返回SwingUtilities
javax.swing.JButton[,0,0101x72,align…
getComponentAt(x,y)应该做你想做的事情,所以你的代码有点问题。我担心如果没有一些小的代码示例来演示这个问题,你将不会得到太多帮助。@Guillaume Polet通过add
Component c=SwingUtilities.getDeepestComponentAt(…..
System.out.println(c)发布代码;
返回SwingUtilities
javax.swing.JButton[,0,0101x72,align…..