gpt4 book ai didi

java - 如何每秒编辑一次Jlabel?

转载 作者:行者123 更新时间:2023-12-02 06:39:28 29 4
gpt4 key购买 nike

如何在某些游戏中每秒编辑 JLabel,例如(剩余时间或得分)。 这是我的代码

static int l = 1;
static int s = 5000;
static int t = 90;
public static void main(String[] args) {

//Frame
final JFrame f = new JFrame();
f.setTitle("Picture Puzzle");
f.setSize(500,500);
f.setLocationRelativeTo(null);
f.setResizable(false);
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
f.setVisible(true);

//这里有一些额外的东西

    JLabel blevel00 = new JLabel("Level:" + l);
JLabel bscore00 = new JLabel("Score:" + s);
JLabel btime00 = new JLabel("Time:" + t);

p2.add(blevel00);
p2.add(bscore00);
p2.add(btime00);

//这里有一些额外的东西

    start.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
while(t != 0 ) { //the t is the static int t = 90;
f.add(p2);
f.remove(p1);
f.setVisible(true);
f.revalidate();
f.repaint();
}
t--;
}
});

}}

我试过了,但没有任何反应。任何帮助将不胜感激。

最佳答案

Swing 是单线程环境,也就是说,对 UI 的所有变更和修改都应该在事件调度线程的上下文中发生。

任何阻塞该线程的事情(例如永无休止的循环或阻塞 I/O)都会阻止该线程处理新事件,包括绘制事件。

Swing 为这个问题提供了许多解决方案,在您的情况下,最好的解决方案可能是使用 javax.swing.Timer。这将允许您安排在 EDT 上下文中调用的定期回调,从而允许您定期对 UI 进行修改。

看看Concurrency in SwingHow to use Swing Timers了解更多详情

使用简单示例进行更新

enter image description here

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class SimpleClock {

public static void main(String[] args) {
new SimpleClock();
}

public SimpleClock() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {
private JLabel time;
public TestPane() {
setLayout(new GridBagLayout());
time = new JLabel();
time.setFont(time.getFont().deriveFont(Font.BOLD, 48));
add(time);
updateTime();
Timer timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateTime();
}
});
timer.start();
}

protected void updateTime() {
time.setText(DateFormat.getTimeInstance().format(new Date()));
}
}

}

关于java - 如何每秒编辑一次Jlabel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19286746/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com