如何刷新或重新加载JFrame?

28

我正在使用Java进行项目,需要在单击JFrame中的特定按钮后重新加载整个JFrame。如何做到这一点?


5
“refresh”是什么意思?它是指“将所有组件恢复到首次放入框架时的状态”,还是指“更改组件”,或者其他什么意思? - Andrew Thompson
在运行时添加/删除JComponent或更改大小时,需要重新布局... - mKorbel
你正在使用JFrame做什么?请详细说明。 - Hemang Rami
1
这个问题的描述没有给出足够的细节,无法回答。您能否分享更多必要的信息? - Hovercraft Full Of Eels
2
这里有一个例子(https://dev59.com/RlbUa4cB1Zd3GeqPAaOk#5812981),可能会帮助你入手。 - trashgod
然而,这个问题已经得到了回答,而且至少其中一个答案是有帮助的。所以这个问题并不完全没有用,对吧? - undefined
5个回答

53
SwingUtilities.updateComponentTreeUI(frame);

如果仍然无法正常工作,则在完成上述步骤后尝试

frame.invalidate();
frame.validate();
frame.repaint();

6
对于 updateComponentTreeUI 方法,几乎总是不应该使用它(因为它会重新设置 UI 代理),当最可能的目标仅仅是重新加载数据时。 - kleopatra
2
“_reload frame_”不是一个技术术语,无论它的意思是什么,“updateComponentTree”都不是答案。实际上,这个问题太过于不具体,无法回答,因此投票关闭。 - kleopatra
1
那么,答案是什么呢?updateComponentTreeUI调用可以完成任务。 - foo
1
那么,答案是什么呢?updateComponentTreeUI调用就可以完成任务。 - foo
1
@foo 使用任何有效的方法。你可以完全忽略那些只说“不要做X”而不提供替代方案的人。这是唯一对我有效的解决方案。其他建议关闭并重新显示框架的做法是愚蠢的。 - undefined

4

只需要使用 frame.setVisible(false); frame.setVisible(true); 我曾经有一个包含图像的JLabel出现了问题,这解决了它。


2

这是一段可能有帮助的简短代码。

    <yourJFrameName> main = new <yourJFrameName>();    

    main.setVisible(true);
    this.dispose();

在哪里...

main.setVisible(true);

将会再次运行JFrame。

this.dispose();

将终止正在运行的窗口。


问题是关于重新加载框架(原地),而不是显示框架。setVisible 不会再次显示框架,它只根据参数显示或隐藏框架。 - TT.

-1

尝试使用这段代码。我之前也遇到了相同的问题,不过最终还是解决了。

public class KitchenUserInterface {

    private JFrame frame;
    private JPanel main_panel, northpanel , southpanel;
    private JLabel label;
    private JButton nextOrder;
    private JList list;

    private static KitchenUserInterface kitchenRunner ;

    public void setList(String[] order){
        kitchenRunner.frame.dispose();
        kitchenRunner.frame.setVisible(false);
        kitchenRunner= new KitchenUserInterface(order);

    }

    public KitchenUserInterface getInstance() {
        if(kitchenRunner == null) {
            synchronized(KitchenUserInterface.class) {
                if(kitchenRunner == null) {
                    kitchenRunner = new KitchenUserInterface();
                }
            }
        }


        return this.kitchenRunner;
    }

    private KitchenUserInterface() {


        frame = new JFrame("Lullaby's Kitchen");
        main_panel = new JPanel();
        main_panel.setLayout(new BorderLayout());
        frame.setContentPane(main_panel);



        northpanel = new JPanel();
        northpanel.setLayout(new FlowLayout());


        label = new JLabel("Kitchen");

        northpanel.add(label);


        main_panel.add(northpanel , BorderLayout.NORTH);


        frame.setSize(500 , 500 );
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private KitchenUserInterface (String[] order){
        this();
        list = new JList<String>(order);
        main_panel.add(list , BorderLayout.CENTER);

        southpanel = new JPanel();
         southpanel.setLayout(new FlowLayout());

         nextOrder = new JButton("Next Order Set");
         nextOrder.addActionListener(new OrderUpListener(list));
         southpanel.add(nextOrder);
         main_panel.add(southpanel, BorderLayout.SOUTH);



    }

    public static void main(String[] args) {
        KitchenUserInterface dat = kitchenRunner.getInstance();
        try{

        Thread.sleep(1500);
        System.out.println("Ready");
        dat.setList(OrderArray.getInstance().getOrders());
        }
        catch(Exception event) {
            System.out.println("Error sleep");
            System.out.println(event);
        }


        }

}

-4

你应该使用这段代码

this.setVisible(false); //this will close frame i.e. NewJFrame

new NewJFrame().setVisible(true); // Now this will open NewJFrame for you again and will also get refreshed 

11
问题不好会引来不好的答案(这也是为什么建议关闭问题的原因,但未成功;-) 不要 - 无论问题的真正问题是什么,创造一个新框架都不是解决方案。你不会只因为房子需要重新粉刷就拆掉它,对吧? - kleopatra
1
@kleopatra 不,他不会这样做。 - user6490462

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接