我知道这个问题已经被提出很多次了,我感觉在过去的 3 个小时里浏览了很多帖子、教程和其他相关内容,但我被困住了,我根本不明白什么错了,因为它看起来很简单,但根本行不通......
我有一个基于 GUI 的程序(工作正常),GUI 是在扩展 JFrame 的视图类中构建的,构建 GUI 等等,都是标准的。视图类中的 JButton 生成另一个类的实例(在下面的代码片段中称为 GReader),该类的构造函数调用此类的方法,并且在该方法中调用同一类中的另一个方法。 GReader类的结构如下:
public class GReader {
JFrame frame;
JPanel panel;
JProgressBar bar;
public GReader (>> constructor input <<) {
someMethod(input);
}
someMethod(>> method input <<) {
createProgressBar(some number);
loop { here: update of bar.setValue(progress indicator) }
closeProgressBar();
}
private void createProgressBar (int maxValue) {
frame = new JFrame("Operation Progress");
panel = new JPanel();
bar = new JProgressBar(0, maxValue);
bar.setValue(0); // initial value
panel.add(bar);
frame.add(panel);
frame.pack();
// bar.setVisible(true);
// panel.setVisible(true);
frame.setVisible(true);
}
private void closeProgressBar() {
frame.setVisible(false);
frame.dispose();
}
}
可以看出,这个构造的目的只是为了监控某些操作的进度。 GReader 类中的所有功能都按预期工作,除了操作进度的显示之外。 我还阅读了有关 ProgressMonitor 的内容,并对它进行了一些修改,但没有结果。上面的代码片段现在显示了第一次尝试,因为任何修改都会以相同的观察结果结束:面板未显示在框架中。仅出现 JFrame - 空的,打包后缩小为 3 x 2 厘米的窗口。其余部分(上面的代码/伪代码混合中未显示)工作正常,操作完成(没有进度监视器...)等等。
为什么 JFrame 保持为空?难道不能简单地打开2个窗口与内容并行吗?这是我的普遍误解吗?或者这是否需要更复杂的措施,例如启动一个新线程,等等?
非常感谢您的任何提示。
您遗漏了很多细节。 这是一种解决方案,但您必须根据您的设计对其进行改造。最好对 JPanel 进行子类化,以便您可以覆盖
getPreferredSize()
您还需要向进度条添加一个侦听器来捕获事件。
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
public class GReader extends JPanel {
JFrame frame;
JProgressBar bar;
public static void main(String [] args) {
SwingUtilities.invokeLater(()->new GReader());
}
public GReader() {
frame = new JFrame("Operation Progress");
frame.add(this);
frame.pack();
frame.setLocationRelativeTo(null); //center on screen
frame.setVisible(true);
createProgressBar(10);
}
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
private void createProgressBar(int maxValue) {
bar = new JProgressBar(0, maxValue);
bar.setValue(0); // initial value
add(bar);
}
}