我有一个程序,其中有JWindows,可以通过单击和拖动来重新定位。仅供参考,它们是透明的,有一个蓝色的边界。我想知道通过单击和拖动重新定位矩形(边界)后左上角的坐标。当我点击gui中的一个按钮时,会调用captureComponent()来获取框左上角的当前x和y坐标。我一直在尝试使用Point loc=this.getLocation();当我把它放在MousePress之外时,我会在它被点击并拖动到其他地方之前得到坐标。当我试图把它放在MousePress中,以便它给我更新的值时,它给我的错误是找不到符号:methods getLocation()。我能做些什么来解决这个问题,以便它能给我更新的值?
import javax.swing.*;
import java.awt.event.*;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Point;
import javax.swing.border.LineBorder;
//test
public class Box extends JWindow {
JPanel p=new JPanel();
public Box()
{
this.setAlwaysOnTop(true);
this.setBackground(new Color(0, 0, 0, 0));
setContentPane(p);
setSize(50,25);
//this.setLocation(50, 50);
p.setBorder(new LineBorder(Color.blue));
p.setLayout(new FlowLayout());
p.setBackground(new Color(0, 0, 0, 0));
p.addMouseListener(adapter);
p.addMouseMotionListener(adapter);
}
MouseAdapter adapter= new MouseAdapter()
{
int x,y;
public void mousePressed(MouseEvent e)
{
if(e.getButton()==MouseEvent.BUTTON1)
{
x = e.getX();
y = e.getY();
}
}
public void mouseDragged(MouseEvent e)
{
if( (e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) != 0)
{
setLocation(e.getXOnScreen()-x,e.getYOnScreen()-y);
Point loc = this.getLocation();
}
}
};
public void captureComponent() {
System.out.println(loc);
}
}
当按下按钮时,从另一个类调用captureComponent方法:
btnSnap.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
JButton clickedButton = (JButton) event.getSource();
if (clickedButton == btnSnap) {
//new captureComponent();
//System.out.println("test");
Box capture = new Box();
capture.captureComponent();
}
}
});
它给出了找不到符号的错误:methods getLocation()。
您的MouseListener不是一个组件,因此您不能使用该方法,除非您有对组件的引用。
一种方法是获取生成事件的组件的窗口:
Component component = e.getComponent();
Window window = SwingUtilities.windowForComponent( component );
Point location = window.getLocation();
编辑:
当我点击gui中的一个按钮时,会调用captureComponent()来获取框左上角的当前x和y坐标。
第一次错过了上面的陈述。你的代码太复杂了。如果您只想在单击按钮时知道窗口的位置,那么只需调用captureComponent()
方法中的getLocation()
方法即可。不需要每次拖动窗口时都保存位置。