我的JComponent的内容仅在手动调整大小后刷新

use*_*304 3 java swing resize refresh jcomponent

我试图弄清楚当我手动拖动窗口时我的JComponent刷新的原因,但是当我调用repaint或revalidate时它不会刷新.数据已准备好显示,但只有在我手动调整大小后才会显示.任何人都能提出一些关于我能做什么的建议,或者这听起来好像不是Swing问题,因为我尝试重新绘制并重新验证?

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

sp.setSize(sp.getSize().width, sp.getSize().height+1);
sp.setSize(sp.getSize().width, sp.getSize().height-1);
Run Code Online (Sandbox Code Playgroud)

如果使用第一行,则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);
  }
 }
Run Code Online (Sandbox Code Playgroud)

BTW parentContainer是JDesktopPane

jac*_*bit 7

更改容器的内容时​​,您必须同时调用:

  • revalidate() 使其重新计算其内容的布局
  • repaint() 请求为此容器重新绘制