我正在设计一个绘图程序(用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();
感谢您的任何建议,马克斯
-
setVisible(true);
必须是 中的最后一个代码行public MainFrame() {
-
应该
this.keyboard = new start_vk();
???,什么来使用Swing Timer
来调用某些东西并处理 -
调用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
方法复制粘贴):
此方法更改与布局相关的信息,因此使组件层次结构失效。如果容器已显示,则必须在之后验证层次结构才能显示添加的组件。