Java - 更新在Swing中创建的GUI

时间:2012-03-17 16:39:38

标签: java swing user-interface netbeans

我正在尝试创建一个只有2个元素的简单GUI表单 - 一个简单的标签和一个按钮。按钮上显示的文字是“开始”。标签默认显示为0。

当我点击开始按钮时,应执行以下操作:

  1. 计数器应每1秒从0开始递增1。
  2. “开始”按钮上显示的文字将变为“停止”。
  3. 当我再次点击相同的按钮(现在显示标题为Stop)时,增量将停止。
  4. 按钮上的文字应更改为“开始”。等等......
  5. 我正在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. 如何每1秒更新一次lblCounter?
    2. 我应该实现什么逻辑来启动1秒的计时器以及如何在该方法中访问lblCounter?
    3. 请帮助。非常感谢工作代码。提前谢谢。

2 个答案:

答案 0 :(得分:6)

只需使用javax.swing.Timer,然后制作一个ActionListener即可为您完成此操作。给我一个工作代码示例10分钟: - )

以下是一个示例程序以获得进一步的帮助:

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的{​​{1}}方法。

答案 1 :(得分:2)

好的,我建议看看SwingWorker。您可以使用a while(!isCancelled())扩展SwingWorker并在doBackground()执行Thread.sleep(1000);循环中执行睡眠后,您只需触发一个属性更改,该属性更改会增加标签的值。

每当按下停止按钮时,只需取消当前的挥杆工作人员即可。当您按下开始按钮时,只需execute()摇摆工作者