【问题标题】:layout manager cancelling set location of jlable布局管理器取消 jlabel 的设置位置
【发布时间】:2014-10-16 13:26:04
【问题描述】:

我编写了如下代码,并且 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();
}

【问题讨论】:

  • 不要尝试和更新 EDT 之外的 UI 组件。见Concurrency with Swing
  • “问题可能来自 JFrame 布局管理器吗?” - 是的。使用布局管理器时位置不适用。但是您应该使用布局管理器。见Laying out Components Within a Container
  • 您正在尝试制作某种类型的动画,如果是这样,那么我想在包含 JLabel 的 JPanel 上使用空布局是可以的,但您必须专门设置 JPanel有了这个布局。它不会自动出现。另外,是的,您的 Swing 调用必须在 Swing 事件线程上完成。一种简单的方法是使用 Swing Timer 而不是直接使用后台线程。
  • @peeskillet 我编辑了问题
  • @HovercraftFullOfEels 我编辑了问题

标签: java multithreading swing netbeans layout-manager


【解决方案1】:

再次

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

【讨论】:

  • 是的,我想为标签制作动画并一起增加另一个标签的价值。 jlabel2 返回空布局。我也为 jlabel1 使用计时器,但不工作,也调用 revalidate() 和 repaint() 方法,但不能再次工作...... :(
  • @Ahmad:如果您需要有关无法正常工作的代码的帮助,那么您应该发布minimal runnable example program 作为对您问题的编辑。
猜你喜欢
  • 2013-10-08
  • 2023-02-09
  • 2013-07-11
  • 1970-01-01
  • 2010-11-25
  • 2014-03-20
  • 2012-12-15
  • 1970-01-01
  • 2015-12-07
相关资源
最近更新 更多