【问题标题】:Swing Timer in Netbeans GUINetbeans GUI 中的摆动计时器
【发布时间】:2015-04-08 14:50:42
【问题描述】:

这是我的第一个 Swing 应用程序,所以我使用了 NetBeans GUI Builder。 有一个开始按钮来开始模拟(两个循环:外部按天,内部按小时)。在每次迭代中,循环都应该暂停。当您单击停止按钮时,模拟应该停止。我尝试了以下方法: 1)

private void StartActionPerformed(java.awt.event.ActionEvent evt) {                                      
    Timer timer = new Timer(5000, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            while(presentDay <= numberOfDays){
                jTextField2.setText(Integer.toString(presentDay));
                for(; presentTime <= 18; presentTime++){
                    jTextField6.setText(Integer.toString(presentTime));

                    StringBuilder res = new StringBuilder();

                    for(Event ev: schedule[presentDay-1].day){
                        if((presentTime <= ev.getTimeFinish()) && (presentTime >= ev.getTimeStart())){
                            res.append(ev);
                            ev.setStatus(1);
                        }
                    }
                    currentEvent.setText(res.toString());
                    // Pause should here
                }
                presentTime = 9;
                presentDay++;
            }
        }
    });
    timer.start();
}

2) 在主类构造函数中添加定时器

public PlanningSystem() {
    initComponents();
    ...
    timer = new Timer(5000, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            while(presentDay <= numberOfDays){
                jTextField2.setText(Integer.toString(presentDay));
                for(; presentTime <= 18; presentTime++){
                    jTextField6.setText(Integer.toString(presentTime));

                    StringBuilder res = new StringBuilder();

                    for(Event ev: schedule[presentDay-1].day){
                        if((presentTime <= ev.getTimeFinish()) && (presentTime >= ev.getTimeStart())){
                            res.append(ev);
                            ev.setStatus(1);
                        }
                    }
                    currentEvent.setText(res.toString());
                    // Pause here
                }
                presentTime = 9;
                presentDay++;
            }
        }
    });
}
private void StartActionPerformed(java.awt.event.ActionEvent evt) {                                      

    timer.start();
}

但是这两种方法都不起作用。我希望你能帮助解决这个问题。 对不起我的英语:)

================================================ ======================== 编辑后:

private void StartActionPerformed(java.awt.event.ActionEvent evt) {                                      
if(presentDay <= numberOfDays){
    jTextField2.setText(Integer.toString(presentDay));
    Timer tim = new Timer (5000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
        if(presentTime <= 18){
            jTextField6.setText(Integer.toString(presentTime));
            StringBuilder res = new StringBuilder();
            for(Event ev: schedule[presentDay-1].day){
                if((presentTime <= ev.getTimeFinish()) && (presentTime >= ev.getTimeStart())){
                    res.append(ev);
                    ev.setStatus(1);
                }
            }
            currentEvent.setText(res.toString());
            presentTime++;
        }
        }
    });            
    tim.start();
    presentTime = 9;
    presentDay++;
}
}

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。 2) 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)并始终如一地使用它。
  • 据我所知,您只需将前两个循环替换为if 块,例如if ( presentDay &lt;= numberOfDays ) { if ( presentTime &lt;= 18 ( ) { DO WHAT YOU DOING, HERE } }。这应该有效。由于您在指定时间后调用此操作,如初始化 Timer 对象引用时所述。
  • @nIcEcOw 我用 if 块替换循环,但现在计时器仅适用于 if(presentDay

标签: java swing netbeans timer gui-builder


【解决方案1】:

您的 while 循环是问题所在。第一次调用计时器时,您将 presentDay 递增到 numberOfDays。在那之后,一切都不会再改变了。

我相信(尽管由于您发布的部分代码,我无法确定)如果您取出 while 循环,它会按您的意愿工作

编辑:(更好地理解你在做什么)

使用两个计时器是错误的。只需使用一个计时器,并在那里更新您的 presentDay 和 presentTime。

Timer tim = new Timer (5000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
           presentTime++;
           if (presentTime == 24) {
             presentTime = 0;
             presentDay++;
           }
           //times how now been set
           //update your GUI here

        }
}

【讨论】:

  • 我做到了,但现在计时器仅适用于 presentTime。我还使用了两个计时器(用于 presentDay 和 presentTime),但它们是分开工作的。
  • 对不起,我不明白你能澄清一下吗?
  • 我编辑帖子,希望它能帮助你理解我。在我的最后一个代码中,presentTime 会随着暂停而增加。这是正确的。由于if 语句,presentDay 不会增加。但是,如果我在 while 上替换 if,那么 presentDay 会立即采用 numberOfDays 的值。
  • 太棒了!点击我的答案作为解决方案?
【解决方案2】:

看看这是否有帮助,不过,为了模拟两个循环的使用,我使用了BubbleSort 算法。虽然如前所述,删除单个 while 循环会做这件事。由于在这种情况下它按预期工作,但它如何工作,如果列表很长是值得怀疑的。否则你可以看看SwingWorker

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TimerExample {

    private JLabel [] labels;
    private static final int TOTAL_VALUES = 5;
    private static final int GAP = 5;
    private JButton startButton;
    private JButton stopButton;
    private Timer timer;

    private int [] values = {
        5, 10, 20, 2, 8
    };
    private int pass;
    private int i;

    private ActionListener timerActions = new ActionListener () {
        @Override
        public void actionPerformed ( ActionEvent ae ) {
            if ( pass <= TOTAL_VALUES - 1 ) {
                System.out.println ( "Pass: " + pass );
                for ( int i = 0; i <= TOTAL_VALUES - 1 - pass; ++i ) {
                    System.out.println ( "i: " + i );
                    try {
                        int left = Integer.parseInt ( labels [ i ].getText () );
                        int right = Integer.parseInt ( labels [ i + 1 ].getText () );
                        System.out.println ( "[ " + i + " ] " + left + " [ " + ( i + 1 ) + " ] " + right );
                        if ( left > right ) {
                            String value = labels [ i ].getText ();
                            labels [ i ].setText ( labels [ i + 1 ].getText () );
                            labels [ i + 1 ].setText ( value );
                        }
                    } catch ( Exception ex ) {
                        ex.printStackTrace ();
                    }
                }
                ++pass;
            }
        }
    };

    public TimerExample () {
        pass = 1;
        i = 0;
    }


    private void displayGUI () {
        JFrame frame = new JFrame ( "" );
        frame.setDefaultCloseOperation ( JFrame.DISPOSE_ON_CLOSE );

        JPanel contentPane = new JPanel ();
        contentPane.setLayout ( new BorderLayout ( GAP, GAP ) );

        JPanel topPanel = new JPanel ();
        createLabels ( topPanel );
        contentPane.add ( topPanel, BorderLayout.CENTER );

        JPanel bottomPanel = new JPanel ();
        startButton = new JButton ( "Start" );
        startButton.addActionListener ( new ActionListener () {
            @Override
            public void actionPerformed ( ActionEvent ae ) {
                if ( !timer.isRunning () ) {
                    timer.start ();
                }
            }
        } );
        stopButton = new JButton ( "Stop" );
        stopButton.addActionListener ( new ActionListener () {
            @Override
            public void actionPerformed ( ActionEvent ae ) {
                if ( timer.isRunning () ) {
                    timer.stop ();
                }
            }
        } );
        bottomPanel.add ( startButton );
        bottomPanel.add ( stopButton );
        contentPane.add ( bottomPanel, BorderLayout.PAGE_END );

        frame.setContentPane ( contentPane );
        frame.pack ();
        frame.setLocationByPlatform ( true );
        frame.setVisible ( true );

        timer = new Timer ( 1000, timerActions );
    }

    private void createLabels ( JPanel contentPane ) {
        labels = new JLabel [ TOTAL_VALUES ];
        for ( int i = 0; i < TOTAL_VALUES; ++i ) {
            labels [ i ] = new JLabel ( "" + values [ i ], JLabel.CENTER );
            contentPane.add ( labels [ i ] );
        }
    }

    public static void main ( String [] args ) {
        Runnable runnable = new Runnable () {
            @Override
            public void run () {
                new TimerExample ().displayGUI ();
            }
        };
        EventQueue.invokeLater ( runnable );
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    相关资源
    最近更新 更多