Java 使用计时器更新jframe组件的位置

Java 使用计时器更新jframe组件的位置,java,swing,jframe,mouseevent,jlabel,Java,Swing,Jframe,Mouseevent,Jlabel,我正在尝试制作一个使用标签追踪用户鼠标的程序,我有两个问题: 首先,标签的位置由整个计算机屏幕的坐标来判断,而不仅仅是窗口 其次,当计时器使用repaint()时,标签在应用程序中不会移动 私有JPanel内容窗格; /** *启动应用程序。 */ 公共静态void main(字符串[]args){ invokeLater(新的Runnable(){ 公开募捐{ 试一试{ MouseFollowDisplay框架=新的MouseFollowDisplay(); frame.setVisible(

我正在尝试制作一个使用标签追踪用户鼠标的程序,我有两个问题:

首先,标签的位置由整个计算机屏幕的坐标来判断,而不仅仅是窗口

其次,当计时器使用
repaint()
时,标签在应用程序中不会移动

私有JPanel内容窗格;
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
MouseFollowDisplay框架=新的MouseFollowDisplay();
frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
/**
*创建框架。
*/
公共鼠标followDisplay(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
立根(100100450300);
contentPane=newjpanel();
setboorder(新的EmptyBorder(5,5,5,5));
setContentPane(contentPane);
contentPane.setLayout(null);
最终JLabel lblNewLabel=新JLabel(“运行!”);
lblNewLabel.setRequestFocusEnabled(false);
lblNewLabel.setLocation(新点(5,5));
lblNewLabel.立根(10,11,31,23);
contentPane.add(lblNewLabel);
addMouseListener(新的MouseAdapter(){
int延迟=500;
ActionListener MouseDetect=新建ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
//TODO自动生成的方法存根
PointerInfo a=MouseInfo.getPointerInfo();
点b=a.getLocation();
intx=(int)b.getX();
int y=(int)b.getY();
系统输出打印ln(x+“,”+y);
int lx=lblNewLabel.getX();
int ly=lblNewLabel.getY();
如果(lx=x-5&&ly=y-5){
DetectMouse.stop();
showMessageDialog(null,“你输了!”);
}否则{
lx=-((lx-x)*5)/(Math.abs(lx-x));
ly=-((ly-y)*5)/(Math.abs(ly-y));
lblNewLabel.重新喷漆(lx、ly、31、23);
}
如果(延迟>=150){
延迟-=5;
DetectMouse.setDelay(延迟);
}
}
};
Timer DetectMouse=新定时器(延迟、鼠标检测);
公共无效鼠标单击(鼠标事件arg0){
if(DetectMouse.isRunning()){
DetectMouse.stop();
延迟=500;
}
否则{
DetectMouse.start();
}
}   
});
}
}

lblNewLabel.repaint(lx, ly, 31, 23)
呼叫不会移动您的标签。请参阅该重绘方法的javadoc

如果组件正在显示,则将指定区域添加到脏区域列表。在分派所有当前挂起的事件后,将重新绘制组件

您需要做的是调整标签的位置,然后重新绘制面板(标签的旧区域和新区域)


null
布局更好的方法是使用自己的
JComponent
JPanel
覆盖
paintComponent
方法,并使用
Graphics\drawString
方法绘制该字符串。在这种情况下,请不要忘记调用
super.paintComponent
,以避免文本出现多次(例如,请参阅有关忘记调用
super.paintComponent
时会发生什么情况的描述)

我该怎么做?有没有办法让它在设置位置时重新绘制标签?
lblNewLabel.repaint(lx, ly, 31, 23)