【问题标题】:What is java eqivalent for getElementAt(double x, double y) from acm java Libraries(GraphicsProgram);来自 acm java Libraries(GraphicsProgram) 的 getElementAt(double x, double y) 的 java 等效项是什么?
【发布时间】:2012-02-13 12:58:00
【问题描述】:

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

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

【问题讨论】:

  • getComponentAt(x, y) 应该做你想做的事,所以你的代码有问题。恐怕如果没有一些小代码示例来演示问题,您将无法获得太多帮助。
  • @Guillaume Polet 发布代码
  • 通过添加 Component c = SwingUtilities.getDeepestComponentAt(....System.out.println(c); 返回 SwingUtilities javax.swing.JButton[,0,0,101x72, align.....

标签: java swing jframe jcomponent


【解决方案1】:

你要找SwingUtilities#getDeepestComponentAt,例子

import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class TestMouseListener {

    public static void main(String[] args) {
        final JComboBox combo = new JComboBox();
        combo.setEditable(true);
        for (int i = 0; i < 10; i++) {
            combo.addItem(i);
        }
        final JLabel tip = new JLabel();
        tip.setText("Outside combobox");
        JPanel panel = new JPanel();
        panel.add(combo);
        panel.add(tip);
        panel.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseEntered(MouseEvent e) {
                tip.setText("Outside combobox");
            }

            @Override
            public void mouseExited(MouseEvent e) {
                Component c = SwingUtilities.getDeepestComponentAt(
                        e.getComponent(), e.getX(), e.getY());
                tip.setText(c != null && SwingUtilities.isDescendingFrom(
                        c, combo) ? "Inside combo box" : "Outside combobox");
            }
        });
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);

    }

    private TestMouseListener() {
    }
}

【讨论】:

    【解决方案2】:

    这取决于您构建 UI 的方式,但请尝试 Container#findCompoinentAt(int x, int y) - 它返回最顶部可见的子项。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-30
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        相关资源
        最近更新 更多