我在我的 java swing 程序中使用了 3 个命令按钮,例如读取、停止和退出。如果我单击读取按钮,则在读取文件之前,所有 3 个按钮都不会处于启用状态。如果我单击停止按钮,我需要您的帮助才能使这些按钮启用和停止阅读操作。
问问题
280 次
3 回答
3
请注意,Swing 是一个建立在多线程平台之上的单线程框架。因此,当您执行长时间运行的任务时,您不应该使用Swing EDT。
希望 Swing 已经包含了执行如此长时间运行的工作所需的所有内容。
- 创建一个单独的线程来读取您的文件
- 完成后,调用
SwingUtilities.invokeLater
方法以根据您的文件内容刷新 UI。
于 2013-01-28T14:06:13.313 回答
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
。
于 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 回答