SwingWorker Java Swing中的计时器应用程序不起作用

初级

试图组成Java Swing应用程序的一部分,该应用程序应该执行以下操作:

  • 当单击按钮时,从某个文本字段获取“分钟”的用户值(整数);
  • 实例化和实际是SwingWorker线程的对象,它将在inInBackground()完成后启动计时器,使计数返回到零用户“分钟”,然后在done()中执行一些操作(初始化另一个JFrame);

我在代码的某些点上放置了打印件,似乎代码从textField输入了几分钟,然后将其传递给Countdown类中的Constructor,但随后仅执行了done(),而无需先运行doInBackground()。

如果有人暗示为什么会这样,我将非常感激,我已经尝试了所有想法,但没有任何效果。

这是第一部分,来自Button的代码:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

userCountTime = Integer.parseInt(jTextField2.getText());
        userCountTime = userCountTime * 60;
        System.out.println("Preuzeto iz dugmeta " + userCountTime);

        if (jRadioButton2.isSelected()){
            Countdown countDown= new Countdown (userCountTime);
}

这是Countdown类:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.SwingWorker;
import javax.swing.Timer;

/**
 *
 * @author Glupko
 */
public class Countdown extends SwingWorker{
   public Timer timer;
   static int userCountTime;
   static ActionListener timerListener;

   //Constructor
        public Countdown (int userCountTime){
        Countdown.userCountTime = userCountTime;
        System.out.println("In constructor: " + Countdown.userCountTime);
        this.execute();
        }

    @Override
    protected Object doInBackground() throws Exception {
        //defining listener
        timerListener = new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent actionEvent) {
                   System.out.println("In action performed value is:  " + userCountTime); 

                   //for each tick we subtract 1, every second 
                   while (userCountTime >= 0){
                        userCountTime--;
                    System.out.println("In actionPerformed there is number of seconds:  " + userCountTime);}
                timer = new Timer(1000, timerListener);
                //start timer
                timer.start();
                }};}
     @Override
            protected void done(){
                System.out.println("From done: timer elapsed");
                ChangingWindow window = new ChangingWindow();
                }
        }

提前谢谢了!

充满鳗鱼的气垫船
  1. 您不应该从SwingWorker的doInBackground方法中启动Swing计时器这不能实现所有目的,因为应该在Swing事件线程或EDT上运行Swing计时器。
  2. 您的SwingWorker的完工方法将立即被调用,因为它timer.start()是非阻塞的。

取而代之的是摆脱SwingWorker,而直接使用Timer。

有关代码的更完整帮助,请考虑创建并发布您的最小代码示例程序,以供我们检查,测试和修复。

例如,。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import javax.swing.*;

public class CountDownTest extends JPanel {
    private static final Integer[] SECONDS = {1, 2, 3, 4, 5, 6, 7, 8, 9};

    private JSpinner secondsSpinner = new JSpinner(new SpinnerListModel(Arrays.asList(SECONDS)));

    public CountDownTest() {
        add(secondsSpinner);
        add(new JButton(new StartCountDownAction(this, "Start Count Down")));
    }

    public int getSecondsSpinnerValue() {
        return (Integer) secondsSpinner.getValue();
    }

    private static void createAndShowGui() {
        CountDownTest mainPanel = new CountDownTest();

        JFrame frame = new JFrame("CountDownTest");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

class StartCountDownAction extends AbstractAction {
    private CountDownTest countDownTest;
    private Timer timer;

    public StartCountDownAction(CountDownTest countDownTest, String name) {
        super(name);
        this.countDownTest = countDownTest;
        int mnemonic = (int) name.charAt(0);
        putValue(MNEMONIC_KEY, mnemonic);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (timer != null && timer.isRunning()) {
            // don't start a new Timer when one is running
            return; 
        }
        int seconds = countDownTest.getSecondsSpinnerValue();
        timer = new Timer(seconds * 1000, new TimerListener(countDownTest));
        timer.setRepeats(false);
        timer.start();
    }
}

class TimerListener implements ActionListener {
    private CountDownTest countDownTest;

    public TimerListener(CountDownTest countDownTest) {
        this.countDownTest = countDownTest;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(countDownTest, "Timer Done!");
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重置倒数计时器不起作用+ Java Swing游戏中的JDialog / JOptionPane

来自分类Dev

Java SwingWorker挂起

来自分类Dev

为什么我的Java计时器不起作用?

来自分类Dev

SwingWorker中的For循环

来自分类Dev

SwingWorker中的For循环

来自分类Dev

Firebird提交在Java应用程序中不起作用

来自分类Dev

SwingWorker,“取消”按钮不起作用

来自分类Dev

SwingWorker,“取消”按钮不起作用

来自分类Dev

SwingWorker中的错误处理

来自分类Dev

在SwingWorker中实现JScrollPane / JTextArea

来自分类Dev

SwingWorker线程中的多线程

来自分类Dev

在Java中完成SwingWorker之后启动另一个线程

来自分类Dev

JAVA:1类中具有Observer和Swingworker的JProgressbar&Files.copy

来自分类Dev

java - 在 EDT 线程中调用 Thread.sleep() 时 SwingWorker 不运行

来自分类Dev

Java的SwingWorker和Android AsyncTask之间的区别

来自分类Dev

我无法停止Java SwingWorker进程

来自分类Dev

使用递归方法发布Java SwingWorker进程

来自分类Dev

我无法停止Java SwingWorker进程

来自分类Dev

Java SwingWorker无法按预期工作

来自分类Dev

Java:如何对 SwingWorker 进行单元测试

来自分类Dev

Java StopWatch挂起和恢复计时器不起作用

来自分类Dev

Java计时器如何在胁迫下起作用?

来自分类Dev

Java单击事件在Blazor客户端应用程序中不起作用

来自分类Dev

MYSQL-显示变量类似'%version%'在我的Java应用程序中不起作用

来自分类Dev

Java程序中的计时器,倒计时

来自分类Dev

使用SwingWorker / Swing跟踪wget(bash)的进度

来自分类Dev

使用SwingWorker在JTextPane中语法突出显示

来自分类Dev

SwingWorker中setProgress的无法解释的行为

来自分类Dev

JProgress栏未在SwingWorker中更新

Related 相关文章

热门标签

归档