1

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

4

3 回答 3

3

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

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

  1. 创建一个单独的线程来读取您的文件
  2. 完成后,调用SwingUtilities.invokeLater方法以根据您的文件内容刷新 UI。
于 2013-01-28T14:06:13.313 回答
1

使用SwingWorker来做到这一点。在阅读文件时禁用按钮,完成文件后启用按钮。一个简单的例子展示了它是如何工作的。

启用禁用按钮的 Swing Worker 示例 计算前

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

于 2013-01-28T14:34:45.377 回答
1

对于读取按钮,对于这样的 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);
    }

停止阅读动作:将阅读动作作为一个线程(在阅读按钮中),然后在(停止按钮)中停止该线程

例如:

class Read extends Thread {

    public void run() {
    //////////////Read action
}
}
  • 读读 = 新读();

  • 然后在ReadButtonActionPerformed中:read.start();

  • StopButtonActionPerformed中: read.stop();

于 2013-01-28T14:18:31.097 回答