JFrame上添加、删除Jpanel后动态显示界面问题

JFrame中动态添加或者删除JPanel后总是不正确显示需要的界面问题:

1.删除panel后还是显示之前的界面,新删除的panel在界面上并没有被删除;

2.删除panel1后添加新的panel2,只显示删除panel1后的界面,新添加的panel2不显示;

尽管使用了Pane().repaint();重绘方法,照理来说是可以重新绘制新的界面的,但是界面并没有更新。

那么这里就分两种情况处理:

1.删除或者添加一个非JFrame的直接子控件。

scrollPanel.removeAll();//删除scrollPanel的所有子控件,或者scrollPanel.remove(comp);删除scrollPanel的某个控件。

scrollPanel.updateUI();

这里一定要用updateUI()函数,当scrollPanel的内容或者说界面发生变化时需要更新其UI显示。添加也同理。

contentPanel.add(keyLable);//contentPanel添加一个控件

contentPanel.updateUI();

2.删除一个JFrame的直接子控件。

resultFrame.getContentPane().remove(exceptionLabel);//JFrame删除其直接子控件exceptionLabel

resultFrame.getContentPane().repaint();

因为JFrame没有updateUI()函数,所以这里使用重绘函数repaint();

3.JFrame动态添加一个控件,不管这个控件是否还有很多子控件,情况都一样,可以对其子控件使用updateUI()函数。

但是,这还远远不够,你会发现不管添加了什么控件,这个时候界面就是没有更新。

原因是JFrame没有更新。

你可以尝试放大或者缩小窗口,界面就更新了。

那么怎么处理呢?不可能每次都要放大或缩小窗口吧,所以,这里就需要对JFrame进行刷新其界面的操作。

方法1.重新显示窗体。

resultFrame.getContentPane().add(scrollPanel);
resultFrame.setVisible(false);
resultFrame.setVisible(true);

方法2.重新验证窗体。

resultFrame.getContentPane().add(scrollPanel);
resultFrame.invalidate();
resultFrame.validate();

方法3.重置其窗体大小。

resultFrame.getContentPane().add(scrollPanel);
resultFrame.pack();
resultFrame.setSize(1000, 600);

方法远不止上面这几种,但是仅通过这个方法resultFrame.getContentPane().repaint();这个一定是不行的,他不会真正同步重新更新JFrame,除非有外界因素更新到JFrame,不然界面是不会刷新的。

原文地址:https://www.cnblogs.com/hejing-swust/p/8058834.html