2014-10-16 66 views
-1

设置位置,我写我的代码像下面和标签正确地移动:布局管理器取消的jlable

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(); 
} 
+0

不要尝试和更新EDT之外的UI组件。请参阅[与Swing并发](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html) – 2014-10-16 14:04:24

+1

_“是否有可能是JFrame布局管理器的问题?”_ - YES。使用布局管理器时,位置不适用。但你应该使用布局管理器。请参阅[在容器中放置组件](http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html) – 2014-10-16 14:05:48

+0

您正在尝试执行某种类型的动画,如果是这样,那么我假设可以在包含JLabel的JPanel上使用空布局,但是您必须专门设置具有此布局的JPanel。它不会自动来。另外,是的,您的Swing调用必须在Swing事件线程上完成。一个简单的方法是使用Swing Timer而不是直接使用后台线程。 – 2014-10-16 15:43:59

回答

1

再次

  • 如果要动画化成分,那么持有该容器需要使用空布局。如果你不确定它使用的是什么样的布局,问问它 - 打电话getLayout()并打印出结果。
  • 使用Swing Timer而不是后台线程来驱动您的动画。这将确保你在Swing事件线程上进行Swing调用,这是你的代码没有做的事情。
  • 移动你的组件后,在容器上调用revalidate()repaint()来保存它。
+0

是的,我想动画标签和增加另一个标签的价值在一起。 jlabel2返回null布局。我也使用jlabel1的计时器,但不工作,也调用revalidate()和repaint()方法,但不能再工作... :( – 2014-10-16 19:27:28

+1

@Ahmad:如果你需要帮助的代码不工作,那么你应该发布一个[最小化可运行示例程序](http://stackoverflow.com/help/mcve)作为您的问题的编辑。 – 2014-10-16 19:28:47