我刚刚开始编写GUI程序,这是我的第二个。对于这两个项目(两个家庭作业),我遇到了同样的问题。在我调整窗口大小或将键盘焦点移动到它们之前,GUI对象(例如JTextField)不会在应用程序运行时显示。如果我不做这两件事之一,那么我将只有一个空的应用程序窗口。
为什么会发生这种情况以及我能做些什么来解决它?我正在使用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 :(得分:5)
您必须先添加元素 才能使组件可见。
把它作为你的最后一行:
this.setVisible(true);
alt text http://img10.imageshack.us/img10/8210/capturadepantalla200911s.png
这不是OSX相关的,它也发生在Windows中。
答案 1 :(得分:2)
有一些规则关于如何在Swing线程实现之后永远不要触摸Swing对象外部的Swing对象。我总是忽略这些规则,但很可能你在Mac OS下被它们咬了。
作为正式方向的一个步骤,在你组装完整个东西之前,尝试不要执行setVisible(),即在构造函数的底部。
参考资料:http://www.math.vu.nl/~eliens/documents/java/tutorial/ui/swing/threads.html
答案 2 :(得分:0)
猜测:在setBounds
之前添加组件。
答案 3 :(得分:0)
我可能错了 - 自从我在java中完成GUI以来已经很久了 - 但我猜你的问题是在完成添加元素之前使JFrame可见。我认为您之后需要这样做,或者在框架上调用更新。
编辑 - 另外,不确定将布局设置为null是个好主意。我一直使用GridBag,但如果将其设置为null,它可能会失去默认值。