-1

我需要在我的 Java GUI 中运行一个后台线程,该线程仅在我单击一个按钮时运行,并在我再次单击该按钮时暂停。我不确定如何设置它,但是我在构造函数中放置了一个线程,并且当我将特定布尔值设置为 TRUE 时,其中的 while 循环设置为通过。一键切换设置此布尔值 TRUE 或 FALSE。

我在这个 GUI 中的所有其他东西都可以正常工作。当我尝试调试线程时,它实际上在我单步执行线程时工作,但当我尝试完全运行 GUI 时却没有。GUI 相当大,所以我将放置一部分构造函数和按钮的动作侦听器。其余的代码是不必要的,因为它工作得很好。我需要知道我在这里做错了什么:

public BasketballGUI() {
    // certain labels and buttons
    Thread runningSim = new Thread() {
        public void run() {
            while(simRun) {
                // do stuff here
            }
        }
    };
    runningSim.start();
}

// other GUI stuff

// actionListener that should run the thread.
class SimButtonListener implements ActionListener {
    public void actionPerformed(ActionEvent arg0) {
        if(!simRun) {
            simRun = true;
            sim.setText("Pause Simulator");
        }
        else if(simRun) {
            simRun = false;
            sim.setText("Run Simulator");
        }
        // other stuff in this actionListener
    }
}
4

2 回答 2

5
  1. 建立一个基于TimerActionListener被重复调用的 Swing。
  2. actionPerformed(ActionEvent)方法调用repaint()中。
  3. Timer.start()当用户点击时启动计时器 ( )Start
  4. Timer.stop()当用户单击时停止计时器 ( )Stop

如果你不能从那个描述中得到它,我建议你发布你最好的尝试的 SSCCE。


我以为我有一个'躺着'..试试这个工作SSCCE,它使用在这个SSCCE中创建的图像。

于 2013-04-30T03:00:21.450 回答
-1

在处理按钮事件以影响文本区域或进度条等内容时,我可以看到这个后台线程对 Java GUI 很有用。

为便于讨论,我将为您构建一个影响文本区域的小型 GUI。我希望这可以帮助你。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.*;

public class TestClass extends JPanel {

    super("TestClass - Title");
    private AtomicBoolean paused;
    private JTextArea jta;
    private JButton btn;
    private Thread thread;

    public TestClass() {

        paused = new AtomicBoolean(false);
        jta = new JTextArea(100, 100);
        btn = new JButton();

        initialize();
    }

    public void initialize() {

        jta.setLineWrap(true);
        jta.setWrapStyleWord(true);
        add(new JScrollPane(jta));
        btn.setPreferredSize(new Dimension(100, 100));
        btn.setText("Pause");
        btn.addActionListener(new ButtonListener());
        add(btn);

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                while(true) {

                    for(int i = 0; i < Integer.MAX_VALUE; i++) {

                        if(paused.get()) {
                            synchronized(thread) {
                                try {

                                    thread.wait();

                                } catch(InterruptedException e) {
                                }
                            }
                        }
                    }

                    jta.append(Integer.toString(i) + ", ");

               try {

                   Thread.sleep(500);

               } catch (InterruptedException e) {
                }
                }
            }
        };
        thread = new Thread(runnable);
        thread.start();
    }

    @Override
    public Dimension getPreferredSize() {

        return new Dimension(100, 30);

    }

            class ButtonListener implements ActionListener {

                @Override
                public void actionPerformed(ActionEvent event) {

                    if(!paused.get()) {
                        btn.setText("Start");
                        paused.set(true);
                    } else {
                        btn.setText("Pause");
                        paused.set(false);

                        synchronized(thread) {
                            thread.notify();
                        }
                    }
                }
            }
}

调用所有内容的主类。

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class MainClass {

    public static void main(final String[] arg) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestClass());
                frame.pack();
                frame.setVisible(true);
                frame.setLocationRelativeTo(null);
            }
        });
    }
}

我没有测试这段代码来看看它是否能正常工作,它的主要目标是打破你的编码障碍并使用我的组件来解决你的问题。希望这有帮助。需要其他任何东西给我发电子邮件到 DesignatedSoftware@gmail.com

于 2013-04-30T03:16:32.650 回答