我试图弄清楚为什么当我手动拖动窗口时JComponent会刷新,但是当我调用repaint或revalidate时它不会刷新。数据已准备好显示,但是直到我手动调整大小后才显示。有人可以提出一些建议以解决我的问题吗?或者这听起来像不是Swing问题,因为我尝试重新绘制并重新验证?

我注意到的一件奇怪的事情是,如果我有以下代码:

sp.setSize(sp.getSize().width, sp.getSize().height+1);
sp.setSize(sp.getSize().width, sp.getSize().height-1);

如果使用第一行,则JComponent将刷新自身。如果我不使用或不使用这两种方式,那对我来说似乎很奇怪。

我基本上只是将JPanel放在JDesktopPane的JInternalFrame中。我要执行的操作有两个主要功能。一个添加新的JPanel,另一个尝试刷新它,以便显示新数据:
public void addNewSP()
 {
sp = new JInternalFrame("SP");
  sp.setClosable(true);
  sp.setLocation(700, 400); //this should be changed to something based on screen size
  sp.setResizable(true);
  sp.add(popUp);
  this.parentContainer.add(sp, JLayeredPane.DRAG_LAYER);
  sp.pack();
  sp.show();
  sp.setSize(500, 500);
  sp.setPreferredSize(new Dimension(500, 500));
}

public void refreshSP()
 {

  sp.repaint();
  sp.validate();
  sp.repaint();

  sp.validate();
  parentContainer.validate();
  parentContainer.repaint();

  sp.setSize(sp.getSize().width, sp.getSize().height+1);
  sp.setSize(sp.getSize().width, sp.getSize().height-1);
  }
 }

BTW parentContainer是JDesktopPane

最佳答案

更改容器的内容时​​,必须同时调用以下两者:

  • revalidate()以使其重新计算其内容的布局
  • repaint()请求为此容器重涂
  • 10-07 16:20
    查看更多