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



我正在设计一个绘图程序(用Java),应该在其中绘制文本。由于我正在使用kinect执行此操作,因此我想使用我已经找到的屏幕键盘。这个键盘基本上是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 )调用是第一个调用之一(在向容器添加任何组件之前),因此应重新验证布局。

这在这些方法的javadoc中清楚地提到(例如,从Container#add方法复制粘贴):

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

最新更新