我正在学习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, 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 ?
}
}
我想要做的是将JLabel称为" car"每次更新的y坐标,以获得它自身移动的效果,即没有用户交互。我不太清楚如何做到这一点,我想我需要有一些repaint()方法重新绘制JLabel的位置以进行每次更新。但是如何让这个班级知道它需要更新位置?
任何指针(链接/代码)将不胜感激。我想在这种情况下得到Swing及其组件如何工作的概念,而不仅仅是采用解决方案,但当然我对解决方案很感兴趣,所以我可以更接近地研究它。感谢
修改 请参阅上面的编辑代码
答案 0 :(得分:4)
您必须创建一个单独的Thread
,用于修改标签的位置,然后在容器(validate()
)上调用repaint()
和frame.getContentPane()
。不要忘记在线程中添加一些sleep()
值。
但是,有一种更好的方法可以创建单独的JPanel
。在其中,您可以覆盖paintComponent
方法或paint
方法,在那里您可以绘制图像而不是移动JLabel
。
答案 1 :(得分:1)
您最好在布局中添加JPanel
而不是标签。选择JPanel
的尺寸,以便它可以在每个阶段包含您的汽车。
然后覆盖该面板的paint
方法以将图像定位在其上。