【发布时间】: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