2009-11-06 94 views
0

我刚开始编写GUI程序,这是我的第二个GUI程序。对于这两个项目(包括家庭作业),我都有同样的问题。 GUI对象(例如JTextField)不会显示应用程序何时运行,直到调整窗口大小或将键盘焦点移动到它们之后。如果我不做这两件事中的一件,那么我只需要一个空的应用程序窗口。在Mac上不显示Java对象的GUI对象

任何想法,为什么发生这种情况,我能做些什么来解决它?我正在使用Mac OS 10.6.1。

我的代码如下。随意评论我的编码风格,但请关注我遇到的问题。

import javax.swing.*; 
import java.awt.*; 

public class ToDo extends JFrame { 

    private int height = 30, 
       width = 300; 

    public ToDo() { 
     this.setSize(400,400); 
     this.setVisible(true); 
     this.setLayout(null); 
     this.setResizable(true); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setTitle("To Do List"); 
     JTextField todoItem[] = new JTextField [10]; 
     Container contentpane = this.getContentPane(); 
     contentpane.setLayout(null); 
     for(int i=0; i<10; i++) { 
      todoItem[i] = new JTextField(); 
      todoItem[i].setBounds(10,(height*(i)+10),width,height); 
      contentpane.add(todoItem[i]); 
     } 

    } 

    public static void main(String[] args) { 
     new ToDo(); 
    } 
} 

回答

0

猜测:在setBounds之前添加组件。

0

我可能是错的 - 从我在java中完成一个图形用户界面很长一段时间 - 但我猜你的问题是在完成添加元素之前使JFrame可见。我认为你需要事后做,或者在框架上致电更新。

编辑 - 此外,不确定将布局设置为空是一个好主意。我一直使用GridBag,但如果将它设置为null,它可能会失去它的默认值。

+0

如果你只是想要一个静态布局(它根本没有响应来调整窗口的大小),那么将layout设置为null不是问题 – 2009-11-06 22:08:41

2

有一些关于如何在Swing线程实现后不应触摸Swing对象的规则。我总是忽略这些规则,但很可能是你在Mac OS下被他们咬了。

作为正式正确方向的一步,尽量不要做setVisible(),直到你将所有东西组装起来,即在构造函数的底部。

参考资料:http://www.math.vu.nl/~eliens/documents/java/tutorial/ui/swing/threads.html

+0

真的,真的不要忽视这些规则 - 每个JRE的新版本更多地依赖于Kosher线程。当然是 – 2009-11-06 22:36:38

+0

。照我说的做,不要照我的意思去做! 但我刚刚引用的文件似乎表明,我做这件事的方式毕竟是OK的。说真的,我认为如果JRE发生变化就会破坏它(即构建GUI,然后在主线程中设置setVisible()),那么全世界将会有一系列破碎的程序 - 太阳将无法存活这样的变化:) – 2009-11-06 22:49:09

+0

我们还没有讨论过线程,所以感谢您提供该链接。这非常有帮助。 – DiegoFuego 2009-11-07 01:04:51