package components;import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class ProgressBarTest {
JFrame frame = new JFrame("JProgressBar");
int showValue = 0; public void start() {
frame.setLayout(null);
frame.setVisible(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar mb = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem open = new JMenuItem("Open");
open.addActionListener(new FileOpenListener());
fileMenu.add(open);
mb.add(fileMenu);
frame.setBounds(100, 100, 600, 400);
frame.setJMenuBar(mb);
frame.setVisible(true); // showValue = showFileChooser();
// showProgress(showValue); } public static void main(String[] args) {
ProgressBarTest test = new ProgressBarTest();
test.start();
}
public void showProgress(int retValue) {
// JFrame newFrame = new JFrame();
JProgressBar bar = new JProgressBar(0, 100);
bar.setBounds(100, 100, 400, 100);
bar.setStringPainted(true);
// newFrame.add(bar);
// newFrame.pack();
// newFrame.setVisible(true);
frame.add(bar);
if (retValue == JFileChooser.APPROVE_OPTION) {
for (int i = 0; i < 101; i++) {
bar.setValue(i);
bar.setString("touming" + i);
System.out.println("i = " + i);
// newFrame.repaint();
frame.repaint();
try {
Thread.sleep(100);
} catch (InterruptedException ee) {
ee.printStackTrace();
} }
}
} public int showFileChooser() {
JFileChooser chooser = new JFileChooser();
chooser.setBounds(100, 100, 400, 300);
frame.add(chooser);
return chooser.showOpenDialog(frame);
} private class FileOpenListener implements ActionListener { public void actionPerformed(ActionEvent e) { showValue = showFileChooser();
showProgress(showValue);
}
}
}这是源代码,在actionPerformed()里面progressbar就不能正确显示,如果在start()中把最后两句注释去掉,可以看到progressbar可以正确显示。请大虾们指点一下,如何才能在actionPerformed()里也能正确显示progressbar?
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class ProgressBarTest {
JFrame frame = new JFrame("JProgressBar");
int showValue = 0; public void start() {
frame.setLayout(null);
frame.setVisible(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar mb = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem open = new JMenuItem("Open");
open.addActionListener(new FileOpenListener());
fileMenu.add(open);
mb.add(fileMenu);
frame.setBounds(100, 100, 600, 400);
frame.setJMenuBar(mb);
frame.setVisible(true); // showValue = showFileChooser();
// showProgress(showValue); } public static void main(String[] args) {
ProgressBarTest test = new ProgressBarTest();
test.start();
}
public void showProgress(int retValue) {
// JFrame newFrame = new JFrame();
JProgressBar bar = new JProgressBar(0, 100);
bar.setBounds(100, 100, 400, 100);
bar.setStringPainted(true);
// newFrame.add(bar);
// newFrame.pack();
// newFrame.setVisible(true);
frame.add(bar);
if (retValue == JFileChooser.APPROVE_OPTION) {
for (int i = 0; i < 101; i++) {
bar.setValue(i);
bar.setString("touming" + i);
System.out.println("i = " + i);
// newFrame.repaint();
frame.repaint();
try {
Thread.sleep(100);
} catch (InterruptedException ee) {
ee.printStackTrace();
} }
}
} public int showFileChooser() {
JFileChooser chooser = new JFileChooser();
chooser.setBounds(100, 100, 400, 300);
frame.add(chooser);
return chooser.showOpenDialog(frame);
} private class FileOpenListener implements ActionListener { public void actionPerformed(ActionEvent e) { showValue = showFileChooser();
showProgress(showValue);
}
}
}这是源代码,在actionPerformed()里面progressbar就不能正确显示,如果在start()中把最后两句注释去掉,可以看到progressbar可以正确显示。请大虾们指点一下,如何才能在actionPerformed()里也能正确显示progressbar?
new Thread() {
public void run() {
showProgress(showValue);
}
}.start();
}
swing是单线程的,当初是基于为程序员简单地创建新组件考虑,无论是随手而写或者是扩展官方提供的组件
但上文所述规则也是有例外的