我在我的java swing程序中使用3个命令按钮,例如read,stop和exit。 如果我单击读取按钮,则在读取文件之前,所有3个按钮都不处于启用状态。 如果我点击停止按钮,我需要你的帮助才能使这些按钮启用和停止阅读操作。
答案 0 :(得分:3)
请注意,Swing是一个基于多线程平台构建的单线程框架。 因此,当您执行长时间运行的任务时,不应使用Swing EDT。
希望Swing已经包含了执行如此长时间工作所需的所有内容。
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();
: read.stop();
答案 2 :(得分:1)
使用SwingWorker执行此操作。当您正在读取文件时,禁用该按钮,并在完成文件后启用按钮。一个简单的例子说明了它是如何工作的。
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
,其中包含done
和doInBackGround
。在doInBackGround
方法中读取文件并在完成后使用done
方法启用按钮。当点击calculate
时,我正在调用一个名为JButton
的方法。