1

我在跨此 JPanel 移动此 JLabel 时遇到问题?我把代码放在下面。基本上应该发生的是,名为“guy”的 JLabel 慢慢向右移动。唯一的问题是,JLabel 没有刷新它只是在我第一次移动它后消失了。

public class Window extends JFrame{

    JPanel panel = new JPanel();
    JLabel guy = new JLabel(new ImageIcon("guy.gif"));
    int counterVariable = 1;

    //Just the constructor that is called once to set up a frame.
    Window(){
        super("ThisIsAWindow");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(panel);
        panel.setLayout(null);
    }

    //This method is called once and has a while loop to  exectue what is inside.
    //This is also where "counterVariable" starts at zero, then gradually
    //goes up. The variable that goes up is suposed to move the JLabel "guy"...
    public void drawWorld(){
        while(true){
            guy.setBounds(counterVariable,0,50,50);
            panel.add(guy);
            counterVarialbe++;
            setVisible(true);
            try{Thread.sleep(100)}catch(Exception e){}
        }

    }

关于为什么在我更改变量“counterVariable”后 JLabel 只是消失而不是向右移动的任何想法。-谢谢!:)

4

1 回答 1

4

您的代码导致在 Swing 事件线程上运行一个长时间运行的进程,这会阻止该线程执行其必要的操作:绘制 GUI 并响应用户输入。这将有效地使您的整个 GUI 进入睡眠状态。

问题与建议:

  • 永远不要调用Thread.sleep(...)Swing Event Dispatch Thread 或 EDT。
  • 永远不要while (true)在 EDT 上有一个。
  • 而是使用Swing Timer来完成所有这些工作。
  • 无需继续将 JLabel 添加到 JPanel。一旦添加到 JPanel,它就会保留在那里。
  • 同样,无需继续调用setVisible(true)JLabel。一旦可见,它仍然可见。
  • repaint()在移动 JLabel 后调用容器,以请求重新绘制容器及其子项。

例如,

public void drawWorld(){
  guy.setBounds(counterVariable,0,50,50);
  int timerDelay = 100;
  new javax.swing.Timer(timerDelay, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
      countVariable++;
      guy.setBounds(counterVariable,0,50,50);
      panel.repaint();
    }
  }).start;
}

警告:代码未以任何方式编译、运行或测试

于 2012-06-17T02:51:04.780 回答