Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java Jframe在从外部调用时拒绝呈现_Java_Swing_Jframe_Progress Bar - Fatal编程技术网

java Jframe在从外部调用时拒绝呈现

java Jframe在从外部调用时拒绝呈现,java,swing,jframe,progress-bar,Java,Swing,Jframe,Progress Bar,我有一个完全不可思议的问题 情况: 我有一个reporter.java类,我从中调用一个小的JFrame类(status.java),其中包含一个StatusBar。java有一个主函数,我可以从中测试正确性。如果我这样做,一切都会很好 现在有件奇怪的事发生了 我有一个带有菜单栏的JFrame类(menu.java),我从中创建了我的reporter类的实例。当我从那里而不是从它的主函数调用reporter类时,progress类会按请求打开,但它拒绝呈现。我得到的只是一个空框架,我甚至无法关闭

我有一个完全不可思议的问题

情况: 我有一个reporter.java类,我从中调用一个小的JFrame类(status.java),其中包含一个StatusBar。java有一个主函数,我可以从中测试正确性。如果我这样做,一切都会很好

现在有件奇怪的事发生了

我有一个带有菜单栏的JFrame类(menu.java),我从中创建了我的reporter类的实例。当我从那里而不是从它的主函数调用reporter类时,progress类会按请求打开,但它拒绝呈现。我得到的只是一个空框架,我甚至无法关闭,因为它似乎冻结。记者的过程完全一样

我必须补充一点,reporter类中的任务会将数百个表创建到一个pdf文件中。这占用了我win10的全部cpu容量好几分钟

啊,还有一个信息:我在NetBeans 11中创建了所有这些类

下面是我的代码片段:

public class Progress extends javax.swing.JFrame {
    JProgressBar progressBar = null;

    public Progress (int maxvalue) {
        initComponents();
        progressBar = new JProgressBar(0, maxvalue);
        jPanel1.add(progressBar, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 20, 340, 30));
        progressBar.setVisible(true);
        setVisible(true);
        this.repaint();
    }

    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMaximumSize(new java.awt.Dimension(400, 100));
        setMinimumSize(new java.awt.Dimension(400, 100));
        setPreferredSize(new java.awt.Dimension(400, 100));
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jPanel1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
        getContentPane().add(jPanel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 400, 100));

        pack();
    }  

    public void updProgress(int wert) {
        progressBar.setValue(wert);
        progressBar.setVisible(true);
        this.setVisible(true);
        repaint();
    }

    public void kill() {
        this.setVisible(false);
        this.dispose();
    }
    }
...
这里是我的reporter类的调用(通过我的代码)

我从菜单上给记者班打电话

Reporter r = new Reporter();
在main函数中也可以找到完全相同的行。 如前所述,当我从其主要函数调用reporter类时,它工作得很好。当我从菜单类调用完全相同的reporter类时,进度条似乎冻结了。我用一个简单的JLabel而不是进度条进行了尝试。这也不会产生任何效果。一定是JFrame出了问题。也许记者班已经到了极限,也僵化了。它没有GUI,在后台工作,所以我无法检查


有人知道为什么会这样吗?

****我知道了****

我反复使用我的代码,直到最终找到解决方案

在检查调用reporter进程的菜单类时,我意识到当reporter运行时,菜单类被锁定并且没有响应。我无法移动、调整大小或关闭该对象

因此,我创办了谷歌教授,并找到了如何用自己的思路来包装我的记者课程。为此,我必须让reporter实现java.lang.Runnable,然后从菜单类调用reporter,如下所示

Reporter r = new Reporter();
r.setWhere(" year='" + cyear +"'");
r.setReport("T");
Thread t1 = new Thread(r);
t1.start();
我必须创建setWhere和setReport函数来将参数转储到类中,这样才能进行实际的函数调用,从而导致reporter类的run()函数中的重载

然后,这将Swing GUI与大量迭代的reporter类分离,这样我的所有帧都会按照我希望的方式显示

这对我来说是一个新概念。虽然他们在我的java类中向我们展示了线程的概念(18年前),但我从未使用过它。我从来没有一个应用程序,其中的类相互锁定,或者因为它需要大量的CPU负载

有趣的是(对于我这个业余爱好者来说),尽管reporter进程很忙,但我实际上可以从reporter类内部调用并更新progressbar框架,而无需将其包装到另一个线程中。只需将菜单类解耦即可。
非GUI reporter类和progressbar GUI似乎仍然可以协同工作,而不会相互阻塞。

听起来您可能正在使用长时间运行的逻辑来阻碍AWT事件调度线程。是否在EDT线程中调用了
newprogress
(例如从事件侦听器调用)?在那之后,您是否调用了任何长时间运行的调用?嗨,不,我没有事件侦听器。我在reporter例程开始时调用progress类的构造函数,每次完成新的迭代(表)时调用循环中的updProgress函数,并在循环结束时调用kill命令。我不明白的是,当我从主报告员和从外部启动报告员时,系统的行为是不同的。之后,报告者会做完全相同的事情……长时间运行的循环也会阻碍事件分派线程中事件的处理。考虑提供一个缩写形式的报告类,我们可以编译并演示这个问题(即A)。谢谢VGR。我想这很难。我的reporter类有大约600行代码,其中有无数对数据库的SQL调用。这些db调用使它们长时间运行。但是记者班本身就很好。当我从另一个swing JFrame内部启动reporter时,进度条框架不再渲染。也许正如建议的那样,这两个JFrame可能会相互阻塞?我知道所有swing类都在同一线程中运行。我可以强制两个jframe在两个线程中运行以避免锁定吗?也许你会建议。我是java业余爱好者:-)所有Swing和AWT调用都必须在事件调度线程中进行。但是,其他事情,特别是长时间运行的任务,如数据库调用,应该在不同的线程中进行。有关如何实现这一点的示例,请参见。
Reporter r = new Reporter();
r.setWhere(" year='" + cyear +"'");
r.setReport("T");
Thread t1 = new Thread(r);
t1.start();