当前位置: 首页 > 知识库问答 >
问题:

更新JFrame中的JPanel

关志勇
2023-03-14

我有一个带有卡布局组件的JFrame。我正在使用卡布局在应用程序执行的不同时刻在不同的JPanel之间切换。在某些时候,我正在使用摇摆工人对象来生成一些XML文件。在这段时间里,我想在我的窗口中显示另一个JPanel,告诉用户等待。在这个JPanel上,我想在3个标签之间切换。

  • 吉列布尔1会说:“请稍候。
  • 吉拉贝尔2会说:“请稍候..”
  • 吉拉贝尔3会是:“请稍候...”

现在代码如下:

        ConvertersWorker.execute();
        CLayout.show(Cards, WAIT_PANEL);


        Timer t =new Timer(500, new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e) {
                WaitPanel.SwitchLabels();
            }               
        });
        t.start();

        while (!this.finishedConverting)
        {

        }
        //After this im am executing other methods based on the generated XML files

SwingWorker代码:

SwingWorker<Boolean, Void> ConvertersWorker = new SwingWorker<Boolean, Void>() {
    public Boolean doInBackground() {
        Boolean result = RunConverters();
        return result;
    }
    public void done() {
        try {
            finishedConverting = get();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        } catch (ExecutionException ex) {
            ex.printStackTrace();
        }
    }
 } ;

第二个 JPanel 甚至没有显示,因为 JFrame 块。由于 while 循环,它阻塞了,但我不知道如何以不同的方式实现它。而且,从摇摆工人完成的方法()永远不会被执行。如果执行它,则完成的转换变量将设置为 true,并且 while 循环将停止。任何人都可以帮我找到更好的解决方案吗?

共有2个答案

关翰
2023-03-14

我移除了< code>while循环,并将循环之后的代码移到了另一个方法中,该方法在< code>SwingWorker的< code>done()方法中执行,因此现在它可以工作了。

赏育
2023-03-14

我知道你解决了这个问题,但这种情况正在发生,因为你只使用了一个线程,并且它因为while而被阻塞,所以你需要创建一个新的线程来处理这个问题

new Thread(){  
  public void run() { 
    //code here
  }
}.start();

要刷新< code>JPanel的内容,您可以使用

myJpanel.doLayout();

或者

myJpanel.repaint();
 类似资料:
  • 问题内容: 下面显示的以下代码会将3个JLabel添加到JFrame中,然后删除3个JLabel。2秒后,它将重新绘制3个JLabel。 我面临的一个小问题是,它正在重新绘制到新的frame(frameTwo)而不是旧的frame(frameOne)。 如何使它重新绘制现有框架而不是重新绘制到新框架? 问题答案: Simpy使用CardLayout来交换视图。 请使用Swing计时器,而不要使用当

  • 编辑:当我拖动边框时,某种刷新被发送,我需要弄清楚并手动发送相同的刷新。 请注意,我已经尝试使用revalidate()和repaint()。 当使用JFrame和JPanel来显示一个框架时,我试图使框架的大小易于改变。 null 此外,一个重要的注意事项是,当您拖动边框时,白条会消失,并正确地重新加载/刷新内容(即使您只是少量拖动)

  • 我一直在努力让我的JFrame重新绘制它的内容。在将新组件添加到JFrame中后,我尝试同时使用revaluate()和repaint()方法,但没有看到框架发生变化。 当用户单击前3个按钮中的任一个时,他们将进入以下代码块 当点击一个按钮时,整个应用程序变成白色,但我看不到我添加的新按钮。当我删除两个setVisible()方法行时,单击一个按钮肯定会删除组件,因为我现在不能单击其中任何一个,但

  • 问题内容: 我有一个JList,它显示来自矢量的信息。然后,用户可以从该向量中添加和删除信息。从Vector添加/删除项目时,是否可以刷新JFrame中的JList?目前我正在做.. 但这不会将JList刷新为新内容。我检查了一下,矢量内容等确实发生了变化,但列表没有刷新。为什么?我该如何解决? 问题答案: 您不应该更新Vector。应该直接对ListModel进行更改,然后表将自动重新绘制自身。

  • 问题内容: 我正在使用GUI和JFrames / JPanels创建棋盘游戏,您可以在计算机上玩该游戏。我有一个名为showPieces()的方法,该方法通过更改按钮数组(以网格格式布置)上的图像图标来更新板子GUI。一旦图标已更新,则和方法将更新GUI。showPieces()方法具有一个参数,每次调用它时都需要将其传递给它。 我遇到的主要问题是,我希望人类采取行动,更新GUI,等待1秒钟,计算

  • 我目前正在用Java制作一个“超级Tic-Tac-Toe”应用程序。以下是我的目标描述。http://mathwithbaddrawings.com/ultimate-tic-tac-toe-original-post.然而,我在点击更新Jframe时遇到了问题。我的应用程序由单独的单元(JLabel)组成,它们构成了Tic-Tac趾板(JPanel),该趾板将驻留在JFrame中。 我的问题是,