gpt4 book ai didi

java - 单击同一按钮上的Java Thread Start-Stop-Start

转载 作者:行者123 更新时间:2023-12-03 13:19:12 29 4
gpt4 key购买 nike

我正在创建一个简单的Java程序,它具有在窗口生成器的帮助下构建的GUI。 GUI只包含一个按钮。

单击按钮后,启动一个线程,该线程将无限次打印到随机数,直到再次单击同一按钮将其停止为止。

这是我的代码

LoopTest.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class LoopTest extends JFrame implements ActionListener {//******
private JButton startB, stopB;
private JTextArea oa;
Start sta;

public LoopTest(){
super("Final Exam: Question ");

Container c = getContentPane();
c.setLayout(new FlowLayout());

startB = new JButton("START"); c.add(startB);

stopB = new JButton("STOP"); c.add(stopB);

oa = new JTextArea(5,20); c.add(oa);
c.add(new JScrollPane(oa));

registerEvents();
sta = new Start("Loop", oa);

}
public void registerEvents(){
startB.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent ae){
if(startB.isEnabled() == true )
sta.setLoopFlag(true);
if(!sta.isAlive())
sta.start();
startB.setEnabled(false);

}
}
);

stopB.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent ae){
if(stopB.isEnabled()==true){
sta.setLoopFlag(false);

}

}

}

);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub

}
public static void main(String[] args){
LoopTest app = new LoopTest();
app.setSize(300,300);
app.setLocationRelativeTo(null);
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setVisible(true);
}

}

启动.java
public class Start extends Thread {

private JTextArea ta;
private boolean loopFlag;

public Start(String name, JTextArea ta){
super(name);
this.ta = ta;
ta.setText("");
loopFlag = true;
}
public void run(){
int num=0;
while(true)
while(loopFlag){
num = 1+ (int)(Math.random()*100);
ta.append(num + "\n");
}
}


public void setLoopFlag(boolean value){
loopFlag = value;
}

}

Stop.java
public class Stop extends Thread {
public Stop( String name ){
super(name);
}
public void run(){

}
}

提前致谢。

最佳答案

当您在Swing事件线程之外对Swing组件进行突变时,您的代码将破坏Swing线程规则。
意见建议:

  • 从不扩展线程。实现Runnable并在线程中使用Runnable几乎总是更好。
  • 除了在Swing事件线程中关闭repaint()之外,避免进行Swing调用。
  • 您的while (true)是一个“紧密”循环-里面没有Thread.sleep,这意味着它有在紧密循环中键入CPU的风险,这可能会妨碍您的程序和计算机。
  • 最好避免在此处完全使用直接后台线程,因为使用Swing计时器可以更轻松,更轻松地解决您的代码问题。请检查Swing Timer Tutorial
  • 您可以通过调用start()stop()方法轻松启动和停止此Timer。
  • 我也将优先使用JList而不是JTextArea,因为它可以更轻松地处理大量数据。
  • 我也喜欢为JButton使用AbstractActions而不是ActionListeners,这个问题很适合自己使用。您可以为开始创建一个 Action ,为停止创建一个 Action ,只需换出按钮的 Action 即可。

  • 例如:
    import java.awt.BorderLayout;
    import java.awt.event.*;
    import javax.swing.*;

    @SuppressWarnings("serial")
    public class StartStop extends JPanel {
    private static final int TIMER_DELAY = 300;
    private StartAction startAction = new StartAction();
    private StopAction stopAction = new StopAction();
    private JButton button = new JButton(startAction);
    private DefaultListModel<Integer> model = new DefaultListModel<>();
    private JList<Integer> jList = new JList<>(model);
    private Timer timer = new Timer(TIMER_DELAY, new TimerListener());

    public StartStop() {
    JPanel btnPanel = new JPanel();
    btnPanel.add(button);

    jList.setFocusable(false);
    jList.setVisibleRowCount(10);
    jList.setPrototypeCellValue(100000);
    JScrollPane scrollPane = new JScrollPane(jList);

    setLayout(new BorderLayout());
    add(scrollPane, BorderLayout.CENTER);
    add(btnPanel, BorderLayout.PAGE_END);
    }

    private class TimerListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
    int num = 1 + (int) (Math.random() * 100);
    model.addElement(num);
    }
    }

    private class StartAction extends AbstractAction {
    public StartAction() {
    super("Start");
    putValue(MNEMONIC_KEY, KeyEvent.VK_S);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    timer.start();
    button.setAction(stopAction);
    }
    }

    private class StopAction extends AbstractAction {
    public StopAction() {
    super("Stop");
    putValue(MNEMONIC_KEY, KeyEvent.VK_S);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    timer.stop();
    button.setAction(startAction);
    }
    }


    private static void createAndShowGui() {
    JFrame frame = new JFrame("Start Stop");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new StartStop());
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    }

    public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> createAndShowGui());
    }
    }

    关于java - 单击同一按钮上的Java Thread Start-Stop-Start,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41349229/

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