布局管理器取消jlabel的设置位置

时间:2014-10-16 13:26:04

标签: java multithreading swing netbeans layout-manager

我编写了如下代码,LABEL正确移动了:

    panel.setLayout(null);

    JLabel label1=new JLabel("LABEL");
    JLabel label2=new JLabel("0");
    JButton btn1=new JButton("start");

    btn1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) 
        {
           Thread t=new Thread()
            {
              public void run()
              {
                  while(true)
                  {
                      try 
                      {
                          Thread.sleep(10);
                      } 
                      catch (Exception ex) 
                      {}
                      label2.setText(String.valueOf(Integer.parseInt(label2.getText())+1));
                      label1.setLocation(label1.getX()+1, label1.getY());
                  }
               }
            };
            t.start();
        }
    });

但是当我在Netbeans Jframe中写道时,它并没有动起来! 问题可能来自JFrame布局管理器吗? 我该如何解决?

在同样的问题上,当我评论下面代码的A行改变jLabel2的位置正常工作但是当A行和B行都没有注释时jLabel2永远不会移动!!

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    Thread t=new Thread()
    { public void run()
      {    while(true)
          {   try 
              {  Thread.sleep(10);  } 
              catch (Exception ex) {}

              /* line A */
              jLabel1.setText(String.valueOf(Integer.parseInt(jLabel1.getText())+1));

              /* line B */
              jLabel2.setLocation(jLabel2.getX()+1, jLabel2.getY());
          }
       }
    };
    t.start();
}

1 个答案:

答案 0 :(得分:1)

再次

  • 如果您要为组件设置动画,则容纳它的容器需要使用null布局。如果您不确定它使用的是什么布局,请询问它 - 致电getLayout()并打印出结果。
  • 使用Swing Timer而不是后台线程来驱动动画。这将确保您在Swing事件线程上进行Swing调用,这是您的代码没有做的事情。
  • 移动您的组件后,请在包含该组件的容器上调用revalidate()repaint()