Как поменять местами 2 таймера? в графическом интерфейсе Java - PullRequest
2 голосов
/ 07 августа 2011

Хорошо, так что в основном то, что я пытаюсь создать таймер, который считает вверх и вниз. Мне нужна программа, чтобы активировать только один таймер одновременно. Есть два таймера, один из которых вызывает увеличение переменной, а другой уменьшение. Кажется, я не могу понять это правильно, когда я нажимаю приращение, переменная увеличивается, но никогда не останавливается, даже когда я нажимаю кнопку уменьшения. Как мне это сделать? Кроме того, еще один быстрый вопрос: как вернуть значение, которое находится в методе нажатия клавиш? Клавиши по умолчанию недействительны, поэтому я поставил в тупик.

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

public class TimerTutorial extends JFrame {

    JLabel timerLabel;
    JButton buttonAdd, buttonMin, buttonReset;
    Timer timer;
    Timer timer2;

    public TimerTutorial() {
        setLayout(new GridLayout(2, 2, 5, 5));

        buttonReset = new JButton("Press to reset");
        add(buttonReset);

        buttonAdd = new JButton("Press to Add");
        add(buttonAdd);

        buttonMin = new JButton("Press to Minus");
        add(buttonMin);

        timerLabel = new JLabel("Waiting...");
        add(timerLabel);

        event e = new event();
        buttonAdd.addActionListener(e);
        buttonMin.addActionListener(e);
    }

    public class event implements ActionListener {

        public void actionPerformed(ActionEvent e) {

            if (e.getSource() == buttonAdd) {

                TimeClassAdd tcAdd = new TimeClassAdd();
                timer = new Timer(1000, tcAdd);
                timer.start();

            } else if (e.getSource() == buttonMin) {
                TimeClassMin tcMin = new TimeClassMin();
                timer2 = new Timer(1000, tcMin);
                timer2.start();


            } else if (e.getSource() == buttonReset) {
                timer.stop();
                timer2.stop();
                // This code does not work
                // Need to revert counter to 0.
            }
        }
    }

    public class TimeClassAdd implements ActionListener {

        int counter = 0;

        public void actionPerformed(ActionEvent f) {

            String status_symbol[] = new String[4];
            status_symbol[0] = "Unused";
            status_symbol[1] = "Green";
            status_symbol[2] = "Yellow";
            status_symbol[3] = "Red";

            if (counter < 3) {
                counter++;
                timerLabel.setText("Time left: " + status_symbol[counter]);
            } else {
                timerLabel.setText("Time left: " + status_symbol[counter]);
            }
        }
    }

    public class TimeClassMin implements ActionListener {

        int counter = 4;

        public void actionPerformed(ActionEvent d) {
            String status_symbol[] = new String[4];
            status_symbol[0] = "Unused";
            status_symbol[1] = "Green";
            status_symbol[2] = "Yellow";
            status_symbol[3] = "Red";

            if (counter >= 3) {
                counter = 3;
                timerLabel.setText("Time left: " + status_symbol[counter]);
                counter--;
            } else if (counter == 2) {
                timerLabel.setText("Time left: " + status_symbol[counter]);
                counter--;
            } else if (counter == 1) {
                timerLabel.setText("Time left: " + status_symbol[counter]);
            }
        }
    }

    public static void main(String args[]) {
        TimerTutorial gui = new TimerTutorial();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setSize(500, 250);
        gui.setTitle("Timer Tutorial");
        gui.setVisible(true);
    }
}

Ответы [ 2 ]

3 голосов
/ 07 августа 2011

Еще одна проблема: ваша кнопка сброса (или любая другая кнопка) ничего не сделает, если вы не добавите к ней actionListener.Другими словами, вам нужно иметь код, похожий на ...

buttonReset.addActionListener(...);

где-нибудь в коде вашей программы, чтобы кнопка работала.

3 голосов
/ 07 августа 2011

В случае, если вы запускаете второй таймер, вам обязательно нужно будет остановить первый таймер, если он все еще работает (то есть, позвоните timer2.stop() непосредственно перед timer.start() и наоборот).

В противном случае оба будут вмешиваться, т. Е. Они получат доступ к одним и тем же полям (в данном случае timerLabel).В зависимости от времени это может выглядеть так, если второй таймер постоянно увеличивает значение.Если, например, таймер увеличения всегда срабатывает вскоре после таймера уменьшения, выходное значение всегда будет 3 - Red.Счетчик сам по себе не увеличивается, но метка заполняется этим значением снова и снова, и, таким образом, похоже, что он полностью игнорирует таймер уменьшения.

Тем не менее, вам также следует остановить каждый таймер, если его счетчик достиг последнегозначение.Больше нет необходимости его запускать.

По поводу вашего второго вопроса: вы не можете присвоить возвращаемое значение, но вместо этого измените какое-то поле вашего слушателя, к которому вы затем сможете получить доступ вне метода действия.

...