JPanel 再次未显示在 JFrame 中

问题描述 投票:0回答:1

我知道这个问题已经被提出很多次了,我感觉在过去的 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个窗口与内容并行吗?这是我的普遍误解吗?或者这是否需要更复杂的措施,例如启动一个新线程,等等?

非常感谢您的任何提示。

java swing progress-bar jpanel
1个回答
-1
投票

您遗漏了很多细节。 这是一种解决方案,但您必须根据您的设计对其进行改造。最好对 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);
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.