当前位置: 首页 > 知识库问答 >
问题:

实施秒表

邢昊焜
2023-03-14

有人能解释一下为什么我的启动/停止按钮不起作用吗?这不是一个完整的秒表,但我被困在这里。感谢您的帮助!这是我第一次在论坛上发帖,所以如果我的帖子有任何问题,请告诉我。这是我的代码:

public class StopWatch {

    private static boolean tiktok;

    public static void setGo(boolean go) {
        tiktok = go;
    }

    public static void main(String[] args) {
        int counter = 0;
        StopWatch stop = new StopWatch();
        ClockFrame window = new ClockFrame("StopWatch");
        JLabel lb = window.init();
        while (true) {
            lb.setText(Integer.toString(counter++));
            if (counter == 61) {
                counter = 0;
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
            }
        }
    }

}

class ClockFrame extends JFrame {
    JLabel hour, minus, sec;

    public ClockFrame(String title) {
        super(title);
    }

    JLabel init() {
        JFrame frame = new JFrame("Stop Watch");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel time = new JPanel();
        hour = new JLabel("0");
        minus = new JLabel("0");
        sec = new JLabel("0");
        time.add(hour);
        time.add(minus);
        time.add(sec);

        JPanel pane = new JPanel();
        pane.setLayout(new FlowLayout());
        JButton start = new JButton("Start");
        start.addActionListener(new startstopActionListener(true));
        JButton stop = new JButton("Stop");
        stop.addActionListener(new startstopActionListener(false));
        JButton reset = new JButton("Reset");
        pane.add(start);
        pane.add(stop);
        pane.add(reset);

        Container window = frame.getContentPane();
        window.setLayout(new GridLayout(2, 1));
        window.add(pane);
        window.add(time);

        frame.setSize(500, 200);
        frame.setVisible(true);
        return sec;
    }
}

class startstopActionListener implements ActionListener {

    private boolean b;

    public startstopActionListener(boolean b) {
        this.b = b;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        StopWatch.setGo(b);
    }
}

共有2个答案

孔砚
2023-03-14

如果你想让秒表摆动,最好看看javax。摆动计时器类。它使定期更新Swing组件(在您的示例中是一个JLabel)变得非常容易。使用计时器可以避免线程。sleep调用,您永远不应该在事件调度线程上调用它,因为它会阻塞UI。

JB Niset已经提供了到Swing并发教程的链接。我建议你也看看这个网站“Swing信息页面”的Swing并发部分提供的链接,以及我对一个相关问题的回答。

杨昊
2023-03-14

您不尊重Swing的线程策略:

  1. Swing组件只能从事件调度线程中使用
  2. 长时间运行和阻塞方法(例如无限循环更新标签的方法)应该在事件调度线程之外运行(但标签的更新必须在EDT中进行-请参阅规则1)

阅读关于并发性的Swing教程。

 类似资料:
  • 问题内容: 我尝试实现冒泡排序,但是不确定它是否正确。如果您可以看一下它,并且它是气泡式的,并且可以通过更好的方式完成,请不要害羞。这是代码: 问题答案: 这是冒泡排序的正常实现,似乎还可以。可以进行几种优化,但是总体思路是相同的。这里有一些想法: 如果在内循环中未执行任何交换时,外循环有一个迭代,则中断,无用继续 在外循环的每次迭代中,交换内循环的方向-从左至右执行一次,然后从右至左执行一次(这

  • 问题内容: 海 我想建立一个包含聊天的网站。我正在使用PHP,我想要一个代码来实现与php的聊天。有人可以帮助我做到这一点吗?我知道阿贾克斯。我不懂其他语言… 问题答案: 我们目前正在与LiveZilla合作,这非常好,这是公司唯一必须拥有Windows PC的东西。操作员界面位于“ .NET”上 livezilla

  • 我坐下来试着实施脑力操。语法似乎很简单。我很难让这个愚蠢的东西发挥作用。我做这件事已经有一段时间了;我承认我需要一些睡眠。也许这就是问题所在。翻译没有输出任何东西。我很确定问题很简单;我知道,在我更好地掌握了这个程序的发展方向之后,我需要对一些函数调用进行模块化。为什么我没有得到输出? 是大脑操的“你好世界”

  • Storm 使用 CGroup 来限制 worker 的资源使用, 以保证公平和 QOS. 请注意:CGroups 目前仅支持 Linux 平台(内核版本 2.6.24 及更高版本) 设置 要使用 CGroups, 请确保正确安装 cgroups 并配置 cgroup.有关设置和配置的更多信息, 请访问: https://access.redhat.com/documentation/en-US/

  • 问题内容: 我的快速搜索显示了参考实现(http://stax.codehaus.org),Woodstox实现(http://woodstox.codehaus.org)和Sun的SJSXP实现(https://sjsxp.dev.java.net / )。 请评论它们的相对优点,并让我介绍我应考虑的任何其他实现。 问题答案: 伍德斯托克斯为我赢得了每一次胜利。这不仅是性能,而且-sjsxp抽搐

  • 问题内容: 我需要NFC标签的CRC16实现。正如标准告诉我的那样,这是ISO / IEC13239,并提供了示例C代码。我将此代码翻译成Java,但结果却是错误的: 正如标准告诉我的那样,应该创建 AC版本的CRC值的字节序列在第42页上:http : //www.waazaa.org/download/fcd-15693-3.pdf 同样,其他CRC实现也不起作用:crc16实现java 第一