返回相对于不是直接父级的JFrame的单击的位置

时间:2017-09-16 07:17:54

标签: java swing jframe jbutton mouselistener

我正在开发一个使用Swing库的简单Java图形游戏。我的JFrame包含JPanel。面板包含按钮。按钮有鼠标监听器。我正试图通过点击按钮获取坐标但是我需要相对于框架的坐标。当我使用e.get(x)get(y)时,坐标与我点击的每个按钮相关。我也不能使用getLocationOnScreen

我需要一些东西来返回相对于作为祖父容器的框架的位置。

2 个答案:

答案 0 :(得分:1)

您可能希望使用SwingUtilities类中的convertPoint方法。

在下面的示例中,我打印相对于按钮,父框架和父框架内容窗格的鼠标事件位置。 然而,似乎框架的内容窗格可能是您最好的尝试,因为框架装饰和边框可能使位置不太准确(在我的Win10上我有大约9“额外像素”)。

另外,请按照@AndrewThompson的建议,告诉我们您为什么要从应用程序中获取此行为,因为可能有更好的解决方案。

示例代码:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
public class JFrameCoordinates
{
    public static void main (String [] a) {
        SwingUtilities.invokeLater (new Runnable () {
            @Override public void run () {
                createAndShowGUI ();
            }
        });
    }
    private static void createAndShowGUI () {
        JFrame frame = new JFrame ("Point test");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setContentPane (new MainPanel ());
        frame.pack ();
        frame.setLocationRelativeTo (null);
        frame.setVisible (true);
    }
}
class MainPanel extends JPanel
{
    public MainPanel () {
        super (new BorderLayout (0, 50));
        MouseAdapter listener = new MouseAdapter () {
            @Override public void mouseReleased (MouseEvent e) {
                JButton button = (JButton) e.getSource ();
                JFrame frame = (JFrame) SwingUtilities.getWindowAncestor (button);
                System.out.println ();
                System.out.println ("Relative to button: " + e.getPoint ());
                System.out.println ("Relative to frame: " + SwingUtilities.convertPoint (button, e.getPoint (), frame));
                System.out.println ("Relative to frame's content pane: " + SwingUtilities.convertPoint (button, e.getPoint (), frame.getContentPane ()));
            }
        };
        add (createButton ("Print Me", listener), BorderLayout.NORTH);
        JPanel panel = new JPanel (new FlowLayout (FlowLayout.CENTER, 20, 20));
        panel.add (createButton ("Print Me", listener), BorderLayout.NORTH);
        add (panel, BorderLayout.CENTER);
        setBorder (new EmptyBorder (20, 100, 20, 100));
    }
    private JButton createButton (String text, MouseAdapter listener) {
        JButton button = new JButton (text);
        button.addMouseListener (listener);
        return button;
    }
}

答案 1 :(得分:0)

import java.awt.MouseInfo;
MouseInfo.getPointerInfo().getLocation().getX() - frame.getX() // X
MouseInfo.getPointerInfo().getLocation().getY() - frame.getY() // Y

这些表达式将返回光标相对于JFrame对象的X和Y坐标。