Таймер Swing в Netbeans GUI

1

Это мое первое приложение Swing, поэтому я использовал Builder Builder NetBeans. Для запуска моделирования используется кнопка "Пуск" (две циклы: внешняя по дням и внутренняя по часам). На каждой итерации цикл должен останавливаться. При нажатии кнопки "Стоп" симуляция должна останавливаться. Я пытался: 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++;
}
}
  • 0
    1) Для более быстрой помощи, опубликуйте MCVE (минимальный завершенный проверяемый пример) или SSCCE (короткий, автономный, правильный пример). 2) EachWordUpperCaseClass общую номенклатуру Java (соглашения об именах - например, EachWordUpperCaseClass , firstWordLowerCaseMethod() , firstWordLowerCaseAttribute если только это не UPPER_CASE_CONSTANT ), и используйте его последовательно.
  • 0
    Насколько я могу судить, вам просто нужно заменить первые два if ( presentDay <= numberOfDays ) { if ( presentTime <= 18 ( ) { DO WHAT YOU DOING, HERE } } блоки if , например if ( presentDay <= numberOfDays ) { if ( presentTime <= 18 ( ) { DO WHAT YOU DOING, HERE } } . Это должно работать Поскольку вы вызываете это действие по истечении указанного времени, как описано при инициализации ссылки на объект Timer .
Показать ещё 1 комментарий
Теги:
timer
netbeans
swing
gui-builder

2 ответа

1
Лучший ответ

Проблема с циклом while. Вы приращением presentDay в numberOfDays первый раз таймер называется. После этого ничего не изменится снова.

Я верю (хотя из-за частичного кода, который вы опубликовали, я не могу быть уверен), что если вы выберете цикл while, он будет работать так, как вы хотите

Изменение: (Лучшее понимание того, что вы делаете)

Использование двух таймеров неверно. Просто используйте один таймер и обновите текущую дату и 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

        }
}
  • 0
    Я сделал это, но теперь таймер работает только для настоящего времени. Также я использовал два таймера (для presentDay и presentTime), но они работают отдельно.
  • 0
    Извините, я не понимаю, вы можете уточнить?
Показать ещё 4 комментария
1

Посмотрите, помогает ли это, однако, чтобы имитировать использование двух циклов, я использовал алгоритм 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 );
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню