我正在开发一个使用Swing库的简单Java图形游戏。我的JFrame
包含JPanel
。面板包含按钮。按钮有鼠标监听器。我正试图通过点击按钮获取坐标但是我需要相对于框架的坐标。当我使用e.get(x)
或get(y)
时,坐标与我点击的每个按钮相关。我也不能使用getLocationOnScreen
。
我需要一些东西来返回相对于作为祖父容器的框架的位置。
答案 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坐标。