Java 移动JLabel';每个更新的位置
我正在学习Swing,我有以下代码:Java 移动JLabel';每个更新的位置,java,swing,user-interface,jlabel,repaint,Java,Swing,User Interface,Jlabel,Repaint,我正在学习Swing,我有以下代码: public class SimView { private JFrame frame; private JLabel background; private JPanel car_panel; public SimView() { frame = new JFrame("GUI"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400,
public class SimView {
private JFrame frame;
private JLabel background;
private JPanel car_panel;
public SimView() {
frame = new JFrame("GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 500);
frame.getContentPane().setLayout(null);
background = new JLabel("");
background.setIcon(new ImageIcon(
"C:\\Users\\D__\\Desktop\\background.png"));
background.setBounds(0, 0, 384, 462);
frame.getContentPane().add(background);
frame.setVisible(true);
car_panel = new JPanel();
car_panel.setBounds(175, 430, 16, 21);
car_panel.setVisible(true);
car_panel.setBackground(Color.BLACK);
background.add(car_panel);
MoveCarRunnable carMover = new MoveCarRunnable(car_panel);
}
private static class MoveCarRunnable implements Runnable {
private JPanel car;
MoveCarRunnable(final JPanel car) {
this.car = car;
}
@Override
public void run() {
// Should I call rePaint() on the car_panel here then ?
}
}
我想做的是在每次更新时移动称为“car”的JLabel的y坐标,以获得其自身移动的效果,即没有用户交互。我不太确定如何做到这一点,我想我需要某种repaint()方法为每次更新重新绘制JLabel的位置。但是我如何让这个类知道它需要更新位置呢
如有任何提示(链接/代码),将不胜感激。我想了解Swing及其组件在这种情况下是如何工作的,而不仅仅是采用一种解决方案,但当然我对一种解决方案感兴趣,这样我可以更深入地研究它。谢谢
编辑:
请参见上面的“我的编辑代码”您最好在布局中添加一个
JPanel
,而不是标签。选择JPanel
的尺寸,以便在每个阶段都能容纳您的汽车
然后覆盖该面板的
paint
方法以将图像定位在其上。您必须创建一个单独的线程来修改标签的位置,然后在容器上调用validate()
和repaint()
(frame.getContentPane()
)。不要忘了在线程中放入一些sleep()
值
但是,有更好的方法来创建一个单独的JPanel
。在它里面,您可以覆盖paintComponent
方法或paint
方法,在那里您可以绘制图像,而不是移动JLabel
s。1。使用javax.swing.Timer调整更新速度2。使用setLocation()移动组件3。使用label.setSize(label.getPreferredSize())调整标签大小。4.使用空布局不是学习Swing的一个很好的选择,而是使用LayoutManager的5。如果你想看一部动画,请看一看@mKorbel pure coincincidence,我猜,或者另一张海报的灵感来自我的例子。。。不可能知道。;-)JPanel是为汽车,还是也为背景?@Jatt没有区别。您必须使用JPanel
作为汽车自身的喷漆区域。使用自己的绘制方法。@Jatt这两种方法都是正确的,通过取消绘制组件或使用JLabel移动,都无所谓,取决于您的决定。您能否提供一个简短的示例来说明您的意思?我已经创建了另一个线程,但不知道如何重新绘制?这对我不起作用。请查看我对迄今为止添加的内容的编辑。将其添加到run()方法中:label.setLocation(x,y);frame.getContentPane().validate();frame.getContentPane().repaint();哎呀。永远不要忘记这一点。但是现在就这么做了。我现在正在尝试您的建议:)@Jatt确保您将代码包装在SwingUtilities.invokeXXX
块中的Threadsrun()
方法中,因为更新JLabel
仅从Thread
定位它不符合Swing最佳实践。或者,看一看将在EDT上运行的a。@Dan我会向OP提到一些关于EDT的内容,因为你给了他使用线程移动Swing组件的建议,这样就可以使其脱离EDT,除非我误解了你的解决方案+1尽管对于JPanel
解决方案通常比移动JLabel
要好(尤其是用于游戏目的)