1

我正在设计一个应该在其中绘制文本的绘图程序(在 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();

感谢您的任何建议,马克斯

4

2 回答 2

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

  2. 应该是什么this.keyboard = new start_vk();???,也许Swing Timer用于调用某些东西并处理

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

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

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

. 4. 尽快发布SSCCE以获得更好的帮助

于 2012-06-18T15:24:07.130 回答
1

由于您的setVisible( true )调用是第一次调用之一(在向容器添加任何组件之前),您应该重新验证布局。

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

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

于 2012-06-18T15:45:16.623 回答