如何启用命令按钮

时间:2013-01-28 14:01:23

标签: java swing events jbutton

我在我的java swing程序中使用3个命令按钮,例如read,stop和exit。  如果我单击读取按钮,则在读取文件之前,所有3个按钮都不处于启用状态。 如果我点击停止按钮,我需要你的帮助才能使这些按钮启用和停止阅读操作。

3 个答案:

答案 0 :(得分:3)

请注意,Swing是一个基于多线程平台构建的单线程框架。 因此,当您执行长时间运行的任务时,不应使用Swing EDT

希望Swing已经包含了执行如此长时间工作所需的所有内容。

  1. 创建一个单独的线程来读取您的文件
  2. 完成后,调用SwingUtilities.invokeLater方法根据您的文件内容刷新UI。

答案 1 :(得分:1)

对于Read Button,对于这样的ex set动作:

private void ReadButtonActionPerformed(java.awt.event.ActionEvent evt) {
       ReadButton.setEnabled(false);
       StopButton.setEnabled(false);
       ExitButton.setEnabled(false);
    }

对于停止按钮:设置这样的动作:

private void StopButtonActionPerformed(java.awt.event.ActionEvent evt) {
       ReadButton.setEnabled(true);
       StopButton.setEnabled(true);
       ExitButton.setEnabled(true);
    }

停止阅读动作: 将读取操作作为一个线程(在Read Button中),然后在(Stop Button)中停止该线程

代表:

class Read extends Thread {

    public void run() {
    //////////////Read action
}
}
  • 阅读read = new Read();

  • 然后在 ReadButtonActionPerformed read.start();

  • StopButtonActionPerformed 中的
  • read.stop();

答案 2 :(得分:1)

使用SwingWorker执行此操作。当您正在读取文件时,禁用该按钮,并在完成文件后启用按钮。一个简单的例子说明了它是如何工作的。

Swing Worker Example to Enable Disable Buttons Before Calculation

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

public class MyProgressBarTest {
    private static final long serialVersionUID = 1L;

    private static JProgressBar progressBar;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            MyProgressBarTest obj = new MyProgressBarTest();
            obj.createGUI();
        }
    });
    }

    public void createGUI() {
        final JFrame frame = new JFrame();

        JPanel panel = new JPanel();
        final JButton button = new JButton("Progress");

        progressBar = new JProgressBar();

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {

                MyCustomProgressBarDialog progressBarObj = new MyCustomProgressBarDialog(progressBar, frame);
                progressBarObj.createProgressUI();

                MyActionPerformer actionObj = new MyActionPerformer(progressBar, progressBarObj, button);
                actionObj.execute();

            }
        });

        panel.add(button);
        frame.add(panel);

        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setLocationRelativeTo(null);
        frame.setSize(200, 300);
        frame.setVisible(true);
    }
}

class MyActionPerformer extends SwingWorker<String, Object> {

    JProgressBar fProgressBar;
    MyCustomProgressBarDialog progressDialog;
    JButton button;

    public MyActionPerformer(JProgressBar progressBar, MyCustomProgressBarDialog progressDialog, JButton button) {
        this.fProgressBar = progressBar;
        this.fProgressBar.setVisible(true);
        this.fProgressBar.setIndeterminate(true);
        this.button = button;
        this.progressDialog = progressDialog;

        this.button.setEnabled(false);
    }

    protected String doInBackground() throws Exception {

        calculateResult();
        return "Finished";
    }

    protected void done() {
        fProgressBar.setVisible(false);
        this.progressDialog.setVisible(false);
        this.button.setEnabled(true);
    }

    public void calculateResult() {
        for (int i = 0; i < 500000; i++) {
            System.out.println("Progress Bar: " + i);
        }
    }
}

class MyCustomProgressBarDialog extends JDialog {
    private static final long serialVersionUID = 1L;

    private static JProgressBar progressBar;
    private JFrame motherFrame;
    private JLabel label = new JLabel("loading.. ");
    private JButton button;

    public MyCustomProgressBarDialog(JProgressBar progressBar, JFrame frame) {

        this.progressBar = progressBar;
        this.motherFrame = frame;
        this.button = button;
    }

    public void createProgressUI() {
        add(label, BorderLayout.NORTH);
        add(progressBar, BorderLayout.CENTER);
        setSize(50, 40);
        setAlwaysOnTop(true);
        setLocationRelativeTo(motherFrame);
        setUndecorated(true);
        setVisible(true);
    }
}

MyActionPerformer类扩展SwingWorker,其中包含donedoInBackGround。在doInBackGround方法中读取文件并在完成后使用done方法启用按钮。当点击calculate时,我正在调用一个名为JButton的方法。