我有一个简单的 JFrame
,其中包含一个 JButton
和一个 JLabel
。
public class Frame extends JFrame {
public Frame() {
initComponents();
this.frameExample = new JFrameExample(jLabel1,jPanel1);
}
@SuppressWarnings("unchecked")
private void initComponents() {
//this method only place the button and the label to the frame, it is auto-genereted by Netbeans tool.
}
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
frameExample.count();
}
public static void main(String args[]) {
new Frame().setVisible(true);
}
JFrameExample frameExample;
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
}
我有一个简单的类,它通过构造函数获取 label
对象,并使用 count()
方法为标签设置一些值。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
public class JFrameExample {
public JFrameExample(JLabel label, JPanel panel) {
this.label = label;
this.panel = panel;
setFrameRefreshTimer();
}
public void setFrameRefreshTimer() {
frameTimer = new Timer (100,new ActionListener() {
public void actionPerformed(ActionEvent e) {
label.revalidate();
label.repaint();
panel.revalidate();
panel.repaint();
System.out.println(label.getText());//doesn't print anything
}
});
}
public void count() {
frameTimer.start();
for (int i = 0; i <= 10; i++) {
label.setText(i + "");
try {
Thread.sleep(500);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
frameTimer.stop();
}
private JLabel label;
private JPanel panel;
private Timer frameTimer;
}
问题是,我想在 count()
方法调用 label
的 setText()
方法时查看数字。但框架不刷新。最后我只看到数字10
。我没有看到其他数字。
我使用了计时器,但没有帮助。我使用定时器错误吗?还有其他解决办法吗?我考虑过多线程
,但我无法让它发挥作用。如果有人能帮助我解决这个问题,我将不胜感激。
注意:我用这个示例简化了我的问题,因此包含更改构造函数参数或类似内容的解决方案不会为我提供解决方案。
最佳答案
使用 setRepeat(true) 重复计时器方法,并在重复 10 次后通过调用 actionPerformed()
方法内的 stop()
方法中断循环。
示例代码:
private int counter = 0;
private Timer timer;
...
timer = new javax.swing.Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
counter++;
if(counter==10){
timer.stop();
}else{
label.setText(counter + "");
}
}
});
timer.setRepeats(true);
timer.start();
注意:
不要使用有时会挂起整个 swing 应用程序的 Thread.sleep() ,而是尝试使用 Swing Timer最适合 Swing 应用。
关于java - 无法刷新 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24863698/