【问题标题】:Refresh JPanel刷新 JPanel
【发布时间】:2010-10-14 19:00:05
【问题描述】:

我需要在 JPanel 上显示不同的绘图。 我已经将绘图文件放入一个数组中,但是当我使用按钮更改它时,JPanel 只显示第一个绘图并且不会更改为下一个绘图...

我已经调用了 panel.revalidate(),但它不起作用。

这是我使用但不工作的代码段。 JPanel 显示是静态的。

    String[] a = {"image1.txt","image2.txt","image3.txt"};
    List<String> files = Arrays.asList(a);


    public void actionPerformed(ActionEvent e) {
    if (e.getSource() == answer1){
        fileNumber++;
        //call other class for painting (files=array files, fileNumber=index of the array)  
        draw = new drawingPanel(files,fileNumber);
        panel.add(draw);
    }
    panel.revalidate();
    panel.repaint();
}

【问题讨论】:

    标签: java swing refresh jpanel


    【解决方案1】:

    您一次只显示一张图纸吗?如果是这样,您可能想尝试使用 CardLayout,这样您就可以轻松地在图纸之间切换。示例见http://java.sun.com/docs/books/tutorial/uiswing/layout/card.html

    前几天我遇到了类似的问题,我试图根据用户选择的 JTabbedPane 的哪个选项卡在我的 UI 上动态显示不同的按钮。 CardLayout 只是让事情变得简单的东西。

    【讨论】:

    • 是的,一次画一张。我的程序与你建议看的例子非常相似。我怎么还是不能改变图纸……这让我很困惑。让我展示一下 Answer 中的代码段。
    • 代码类似于我失败的尝试。在面板上使用 CardLayout;每个drawingPanel 实例都是一张新卡片。以grocerylister.cvs.sourceforge.net/viewvc/grocerylister/… 为例
    • SO 将 cmets 限制为 300 个字符,所以我将在此处继续。在链接代码中搜索“cardPanel”,看看我在做什么。希望您能够根据您的(稍微复杂的)需求对其进行调整。
    • 嗨 ssakl...谢谢你的例子。我现在可以在绘图前添加代码 removeAll() 后显示绘图。
    【解决方案2】:

    您可以尝试保留对您的drawingPanel 的引用,并在重新添加现有drawingPanel 之前调用remove()。根据JPanel JavaDoc,默认布局为FlowLayout - 它不会像您想要的那样替换图像,而是将下一个drawingPanel 放在前一个的右侧。 (调整窗口大小时会发生什么?)

    顺便问一下,如果你超过了数组中的最后一个图像,你如何处理?

    【讨论】:

    • 亲爱的迈克...感谢一百万建议代码 remove()。现在,每次单击按钮时 JPanel 都会显示不同的绘图。哦!!我简直不敢相信只有一个字 ..remove(),这让我花了这么多天的眼泪和不眠之夜!!
    • 哦,我错过了回答你的问题。当我传递最后一张图片时,我添加了 system.exit 代码来关闭它。
    猜你喜欢
    • 2014-08-22
    • 2013-11-14
    • 1970-01-01
    • 2019-06-08
    • 2012-06-22
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多