在调用setVisible(false)后调用set Visible(true)时,我的JFrame内容消失了

我正在设计一个绘图程序(用Java编写),其中应该绘制文本。 因为我用kinect这样做,所以我想使用我已经找到的onscreenKeyboard。 这个键盘基本上是一个JFrame女巫JComponents,我不想太详细了…

public MainFrame() { super("Draw"); setLayout(new BorderLayout()); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); //so basically some standard stuff makeGUI(); this.keyboard = new start_vk(); //strange name for a class but I didn't make it } 

在start_vk中,我可以调用setVisible(true)并且它可以正常工作,但我希望以后只在我需要时调用它…现在我在某个地方调用setVisible(true)并且只显示没有组件的JFrame在里面 …

我应该在一个单独的线程中调用它,因为start_vk的构造函数是使用SwingUtilities.invokeLater()完成的吗? 还是其他任何建议?

  public start_vk() { SwingUtilities.invokeLater(new Runnable() { public void run() { myConf = defaultConf.setDefault(myConf); myKeys = defaultConf.setKeyboard(myKeys); readConf(); thisClass = new vk_gui(); thisClass.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); thisClass.setVisible(true); // I've set it to true here but would like to set it to false to be able to call it later ... } }); } public void newText(){ thisClass.newText(); } public boolean isVisible(){ return thisClass.isVisible(); } public String getText(){ return thisClass.getText(); } 

vk_gui中的代码:

 public String getText(){ if (super.isVisible()) return null; return jTextArea.getText(); } public void newText(){ this.setVisible(true); this.setAlwaysOnTop(true); jTextArea.setText(""); } 

这就是我如何称呼它:

 keyboard.newText(); while(keyboard.getText()==null){} // I know it's busy waiting and it's not good and all that ... text = keyboard.getText(); 

谢谢你的任何建议,马克斯

  1. setVisible(true); 必须是public MainFrame() {中的最后一行代码行

  2. 应该是什么this.keyboard = new start_vk(); ???,也许使用Swing Timer来调用某些东西并进行分析

  3. 在调用setVisible(false)后调用set Visible(true)时,我的JFrame内容消失了

如果您在已经可见的容器中添加或删除某些内容,则必须调用

 nearestContainer.revalidate(); // for JFrame/JDialog/JWindow and upto Java7 is there only validate(); nearestContainer.reapaint() 

。 4.在SSCCE发布后尽快提供更好的帮助

由于setVisible( true )调用是第一次调用之一(在将任何组件添加到容器之前),因此应重新validation布局。

这些方法的javadoc中明确提到了这一点(例如,来自Container#add #add方法的复制粘贴):

此方法更改与布局相关的信息,因此使组件层次结构无效。 如果已显示容器,则必须在此后validation层次结构以显示添加的组件。