繁体   English   中英

从另一个方法更新JFrame

Update JFrame from Within Another Method

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个.csv文件,它是来自60000个手绘数字(手写数字的mnist数据集)的完整像素数据。 按下按钮时将调用一个名为train()的函数。 我希望从train()函数中的每一个60000位数字显示在屏幕上。 代码工作得非常好,我只是无法从train()方法中更新JFrame。

我测试了代码,它100%可以正常工作。 我只是无法在train()函数中更新JFrame。

    public void trainMenu() {
        JButton trainBtn = new JButton("Train");
        JLabel otp = new JLabel();
        JPanel bottomBar = new JPanel();
        trainImage = new ImageIcon();
        JLabel imageLabel = new JLabel(this.trainImage);

        bottomBar.setLayout(new GridLayout(1,2,5,5));
        bottomBar.add(trainBtn);
        bottomBar.add(otp);
        this.frame.getContentPane().add(BorderLayout.CENTER,imageLabel);
        this.frame.getContentPane().add(BorderLayout.SOUTH, bottomBar);
        SwingUtilities.updateComponentTreeUI(this.frame);

        ActionListener trainListener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == trainBtn) {
                    train();
                }
            }
        };

        trainBtn.addActionListener(trainListener);
    }

    void train() {
        BufferedImage bImage;
        //all 60000 numbers are extracted from a .csv file
        //i omitted everything from this function because it's not important for this question
                ...

                //this line is run 60000 times. it displays the converted pixel data (very fast) the code definitely works, it simply won't update.
                this.trainImage.setImage(bImage);
                SwingUtilities.updateComponentTreeUI(frame);
            }
        }


    }

    public static void main(String[] args) {
        new NetGUI();
    }
}

当我按下“火车”按钮时,GUI冻结,并且在train()方法完成之前一直没有响应。

2 个回复

而不是更新trainImage ,为JLabel设置一个新的ImageIcon

imageLabel.setIcon(new ImageIcon(bImage));

您可能还需要在标签上调用revalidate和/或repaint以触​​发新的布局/绘制过程。

就个人而言,我会从train方法返回BufferedImage ,因为train方法确实不应该更新UI,这不是工作。

当我按下“火车”按钮时,GUI冻结,并且在train()方法完成之前一直没有响应。

是的,这是因为Swing与大多数UI工具包一样都是单线程的。 这意味着,如果您在事件调度线程的上下文中执行任何阻止或长时间运行的操作,则将阻止它更新UI或响应任何用户输入。

有关更多详细信息,请参见Swing中的并发

可能的解决方案是使用SwingWorker 这使您可以在其他线程上执行阻止/长时间运行的操作,但是提供了多种将更新安全地同步回UI的方法(Swing也不是线程安全的;)

有关更多详细信息,请参见工作线程和SwingWorker

您的GUI挂起是因为您在Swing事件线程上进行了大量图像操作。 您可以使用诸如SwingWorker之类的东西吗? 这样,您可以在单独的线程上构建映像,并且仅在必要时更新GUI。

private void train() {
    SwingWorker<BufferedImage, Object> worker = new SwingWorker<BufferedImage, Void>() {
        @Override
        protected BufferedImage doInBackground() throws Exception {
            // load the CSV file
            BufferedImage bImage = new BufferedImage();
            // ... fill up the bImage
            return bImage;
        }

        @Override
        protected void done() {
            try {
                BufferedImage img = get();
                // ... set the trainImage
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
    };

    worker.execute();
}
2 通过其他方法通过组件更新JFrame

我正在尝试将JPanel p4添加到JFrame,但它似乎不起作用。 但是,如果我将代码扭曲到如下所示,则JPanel p4将添加到JFrame。 但是一旦我运行代码,JPanel将立即显示。 我只希望在事件(按按钮)后显示JPanel。 所有帮助将不胜感激。 谢谢。 ...

3 从另一个JFrame执行JFrame

我正在制作一个客户端服务器应用程序,其中服务器代码由JFrame执行。这是我的服务器代码,当我从MyServer类的main方法调用Show方法然后正在运行时,但是当我从Jframe的Key Event调用时它正在运行没有显示另一个Jframe。 请帮忙。 这是我的关键事件 通 ...

5 如何在另一个类中更新JFrame?

我想在构造函数外部或从另一个类更新创建的Control的JLabel。 在这里,我创建了一个控件,并在构造函数中添加了一些组件。 UI是在main中创建的,但是我想在此类之外更新一些标签。 所以我创建setResult(final String text,final String path ...

7 从另一个 JFrame 引用一个 JFrame 的方法

我正在使用 NetBeans 中的可视化编辑器为日历应用程序创建 GUI。 我有一个 JFrame (Main) 实例化另一个 JFrame (Output) 并且这样做将自身的引用传递到 Output 的构造函数中。 输出构造器: 但是,当我尝试运行 Output JFrame 的这个方法 ...

9 将组合框的值从另一个jframe传递到jframe

我有2个JFrame,其中一个具有组合框。 我正在尝试获取该组合框的选定索引,并将该值传递给其他JFrame表单。 我尝试这样做:(在NewJFrame.java中) 这样我就可以做到这一点: 但我在那条线上有一个错误。 (线程“ AWT-EventQueue-0”中的 ...

10 在另一个JFrame中使用来自JFrame的数据

我试图在三个不同的JFrame中使用来自一个类的数据。 例如,我创建了MVCE。 在此示例中,我的Person类具有一些信息。 我想在两个不同的JFrame( Screen1和Screen2 )中捕获此信息,并在第三个JFrame( Screen3 )中呈现它们。 我的实现在下面的代码中 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM