0

如何在某些游戏中每秒编辑 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--;
        }
    });

} }

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

4

1 回答 1

3

Swing 是一个单线程环境,也就是说,对 UI 的所有更改和修改都应该在 Event Dispatching Thread 的上下文中发生。

任何阻塞这个线程的事情,比如永无止境的循环或阻塞 I/O 都会阻止这个线程处理新事件,包括绘制事件。

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

查看Swing 中的并发以及如何使用 Swing 计时器了解更多详细信息

用简单的例子更新

在此处输入图像描述

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

}
于 2013-10-10T03:53:23.853 回答