gpt4 book ai didi

Java JFrame 在运行线程时卡住

转载 作者:行者123 更新时间:2023-11-29 03:24:15 24 4
gpt4 key购买 nike

我有一个可能很简单的问题。显然是因为我的程序没有做它应该做的事......

首先是我的代码:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;

public class Timer
extends JFrame
implements ActionListener
{

protected class TThread extends Thread{
private boolean running = false;
@Override
public void run() {
int timer = 10,
index = 0;
running = true;
while(running){
try {
out.setText(timer + " Secs");
timer--;
if(timer == 0){
if(index % 2 == 0){
timer = ti1;
out.setBackground(Color.red);
}else{
timer = ti2;
out.setBackground(Color.green);
}
index++;
}
sleep(1000L);
} catch (InterruptedException e) {
}
}
}
@Override
public void interrupt() {
running = false;
}
}

private static final long serialVersionUID = 1L;
private JTextField t1 = new JTextField(),
t2 = new JTextField();
private int ti1 = 0, ti2 = 0;
private JLabel l1 = new JLabel("Zeit 1"),
l2 = new JLabel("Zeit 2"),
out = new JLabel("00 Secs", SwingConstants.CENTER);
private JButton go = new JButton("Go"),
stop = new JButton("Stop");
private JPanel cont = new JPanel();
private TThread tr = new TThread();

public Timer() {
super("Timer");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(800, 600);
setLayout(null);
add(cont);
cont.setBounds(0, 0, getWidth(), 200);
cont.setLayout(new GridLayout(3, 2));
cont.add(l1);
cont.add(t1);
cont.add(l2);
cont.add(t2);
cont.add(go);
go.addActionListener(this);
cont.add(stop);
stop.addActionListener(this);
add(out);
out.setBounds(0, 200, getWidth(), getHeight()-200);
out.setFont(new Font("Arial", Font.BOLD, 72));

try {
UIManager.setLookAndFeel(new NimbusLookAndFeel());
SwingUtilities.updateComponentTreeUI(this);
} catch (UnsupportedLookAndFeelException e) {
}
}

public static void main(String[] args) {
Timer t = new Timer();
t.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(go)){
ti1 = Integer.parseInt(t1.getText());
ti2 = Integer.parseInt(t2.getText());
tr.run();
}else if(e.getSource().equals(stop)){
tr.interrupt();
}
}
}

回到我的问题:
如果我运行程序并在输入一些数字后点击“开始”按钮,程序就会卡住。我认为问题是由 TThread 中的 while 循环引起的。
自从我上次使用 Threads 以来已经有很长一段时间了,现在我搜索了很长时间但对我没有任何帮助...
希望有人能告诉我问题是什么,并能提供解决方案或一些提示如何解决问题。

问候
最大。

最佳答案

您永远不会通过调用 start() 在后台线程中运行线程。相反,您调用 run() 它将在当前线程而不是后台线程中运行。要解决此问题,请在 Thread 对象上调用 start(),而不是 run()

所以不是:

tr.run();

而是:

tr.start();

其他问题:

  • 通常让类实现 Runnable 比扩展 Thread 更好。
  • 您正在尝试从不应执行的后台线程进行 Swing 调用。几乎所有的 Swing 方法调用都应该在 Swing 事件线程或 EDT 上完成。有关更多信息,请参阅:Concurrency in Swing .
  • 您的其中一个类名 Timer 与关键的 Swing 类相同,即 javax.swing.Timer 类。我会重命名您的类(class)以避免混淆,特别是如果您想要使用 Swing 计时器。
  • 事实上,根据您的代码,我认为您最好为您的应用程序使用 Swing 计时器而不是后台线程。这是制作计时器动画的更简单的方法,并且更容易确保在 Swing 事件线程上进行 Swing 调用。请查看 Swing Timer tutorial .
  • 您正在使用空布局。虽然对于新手来说,空布局通常似乎是轻松创建复杂 GUI 的最佳方式,但随着您获得更多 Swing GUI 经验,您会发现事实恰恰相反。如果您使用布局管理器,通常嵌套 JPanel,每个都有自己的布局管理器,您可以更轻松地创建复杂、漂亮的 GUI,可以轻松调整大小,在所有平台上看起来都不错,并且更容易维护、调试和增强。

关于Java JFrame 在运行线程时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21894020/

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