Java - Обновление графического интерфейса, сделанного в Swing - PullRequest
3 голосов
/ 17 марта 2012

Я пытаюсь создать простую форму графического интерфейса, которая имеет только 2 элемента - простую метку и кнопку.Текст, отображаемый на кнопке: «Пуск».На этикетке по умолчанию отображается 0.

Когда я нажимаю кнопку «Пуск», выполняются следующие действия:

  1. Счетчик начинает увеличиваться на 1 с 0 каждую 1 секунду.
  2. Текст, отображаемый на «Пуск»кнопка должна измениться на Стоп.
  3. Когда я снова нажму на ту же кнопку (теперь с надписью Стоп), инкремент остановится.
  4. Текст на кнопке изменится на Старт.И так далее ...

Я занимаюсь разработкой своего приложения в Netbeans.

Как показано на приведенной выше диаграмме, существует 2 .java-файла

Содержимое AGC.java:

public class AGC extends javax.swing.JFrame 
{
    public AGC()
    {    
        initComponents();
    }

    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() 
            {
                new AGC().setVisible(true);
            }
        });
    }

    private javax.swing.JButton btnStartStop;  // name of start stop button
    private javax.swing.JLabel lblCounter;   // name of the label

}

Содержимое Main.java:

public class Main 
{
    public static int count = 0;
    public static boolean started = false;
}

Я хочу реализовать следующую логику:

private void btnStartStopMouseClicked(java.awt.event.MouseEvent evt) 
{
    if (Main.stared == true)
    {
        // logic to start counting
    }
    else
    {
        // logic to stop counting
    }
}

Моя проблема заключается в следующем:

  1. Как обновлять lblCounter каждую 1 секунду?
  2. Какую логику я должен реализовать, чтобы запустить таймер на 1 секунду и как получить доступ к lblCounter в этом методе?

Пожалуйста, помогите.Рабочий код будет очень высоко ценится.Заранее спасибо.

Джей

Ответы [ 2 ]

6 голосов
/ 17 марта 2012

Просто используйте javax.swing.Timer и создайте один ActionListener , чтобы сделать это за вас. Дайте мне десять минут для примера рабочего кода: -)

Вот пример программы для дальнейшей помощи:

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

public class UpdateWithTimer extends JFrame
{
    private Timer timer;
    private JButton startStopButton;
    private JLabel changingLabel;
    private int counter = 0;
    private boolean flag = false;
    private ActionListener timerAction = new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            counter++;
            changingLabel.setText("" + counter);
        }
    };

    private ActionListener buttonAction = new ActionListener()  
    {
        public void actionPerformed(ActionEvent ae)
        {
            if (!flag)
            {
                startStopButton.setText("STOP TIMER");
                timer.start();
                flag = true;
            }
            else if (flag)
            {
                startStopButton.setText("START TIMER");
                timer.stop();
                flag = false;
            }
        }
    };

    private void createAndDisplayGUI()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);

        JPanel contentPane = new JPanel();
        changingLabel = new JLabel("" + counter);
        contentPane.add(changingLabel);

        startStopButton = new JButton("START TIMER");
        startStopButton.addActionListener(buttonAction);

        add(contentPane, BorderLayout.CENTER);
        add(startStopButton, BorderLayout.PAGE_END);

        timer = new Timer(1000, timerAction);

        setSize(300, 300);
        setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new UpdateWithTimer().createAndDisplayGUI();
            }
        });
    }
}

Если вы хотите, чтобы счетчик снова вернулся к 0, при остановке таймера просто добавьте

else if (flag)
{
    startStopButton.setText("START TIMER");
    timer.stop();
    flag = false;
    counter = 0;
    changingLabel.setText("" + counter);
}

эта часть к buttonAction методу actionPerformed(...).

2 голосов
/ 17 марта 2012

Хорошо, я бы посоветовал взглянуть на SwingWorker . Вы можете расширить SwingWorker и в цикле doBackground () выполнить a while(!isCancelled()) цикл с Thread.sleep(1000);. После выполнения сна вы можете просто вызвать изменение свойства, которое увеличивает значение вашей метки.

Всякий раз, когда вы нажимаете кнопку остановки, просто отмените текущий рабочий свинг. Когда вы нажимаете кнопку запуска, просто execute() рабочий качается

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...