2013-07-19 37 views
0

在我的程序中,我有一个jPanel,里面有一个jLabel。我添加了这个代码以使jPanel可拖动,并且它完美地工作。在可拖动的jPanel中更改jLabel的文本

private void formMousePressed(java.awt.event.MouseEvent evt) {         
    prevX = evt.getXOnScreen(); 
}         

private void formMouseDragged(java.awt.event.MouseEvent evt) {         
    this.setLocation(this.getX() + evt.getXOnScreen() - prevX, this.getY()); 
    prevX = evt.getXOnScreen(); 
    // this.labBirthDate.setText(Integer.toString(this.getX())); 
} 

但是,当我添加注释掉的代码(它更新标签以显示面板的位置)时,它停止工作。具体来说,当我点击并拖动来移动面板,而不是跟随鼠标,面板只是排序,并且文本更改为〜10的值,每当我移动鼠标时都会改变。

让事情变得更加令人困惑,如果我改变它而只是将文本设置为“无效”,它不会产生错误。同样,如果我只是设置一个变量等于this.getX(),它不会产生错误。如果我然后将标签设置为该局部变量的值,则会返回错误。

有谁知道为什么会发生这种情况?有没有可用于获得相同效果的解决方法?

回答

2

当您在标签上调用setText()方法时,将在标签上调用revalidate()repaint()方法。这将导致布局管理器被调用,我猜布局管理器会将面板重置为默认位置。

如果您希望能够在屏幕上随意移动组件,则需要在被拖动的面板的父级上使用空布局。一旦你这样做,你还需要手动设置组件的大小和位置。

在这种情况下,您可能会发现方便使用的Drag Layout