在创建JFrame和添加一些组件时,我注意到,如果在设置JFrame可视按钮和添加按钮之间创建JComboBox实例,则按钮将消失。
我首先创建一个JFrame:
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 200);
然后添加设置为可见的框架并添加一个JButton:
frame.setVisible(true);
frame.add(new JButton("text"));
它按预期工作,并显示一个大按钮:
但是,如果我在这些行之间创建JComboBox的一个实例:
frame.setVisible(true);
new JComboBox();
frame.add(new JButton("text"));
现在纽扣不见了..。
我希望没有任何改变,因为我只是创建一个实例,而不是将它分配给任何东西。
为什么按钮会消失?
此外,如果将new JComboBox();
移动到frame.setVisible(true);
上方,则该按钮再次可见。
发布于 2012-11-05 03:07:17
一旦显示了UI,就不应该从除EDT之外的任何线程修改它。在第一种情况下,你有一些“运气”,这是有效的。在第二种情况下,创建JComboBox的时间很长,足以阻止您从不是EDT的线程修改UI。
您应该做的是调用EDT上的代码:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 200);
frame.add(new JButton("text"));
frame.setVisible(true);
}
})
发布于 2012-11-05 03:20:00
我发现问题在于在向setSize();
添加组件之前调用的setVisible(true);
方法和JFrame
方法。因此,答案很简单,在代码末尾调用setSize();
和setVisible(true)
(或者更好的方法是调用pack();
而不是setSize()
),一切都应该运行良好:
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class Fnatte {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
new JComboBox();
frame.add(new JButton("Text"));
//frame.setSize(200,200);
frame.pack();
frame.setVisible(true);
}
}
发布于 2012-11-05 03:28:41
从JavaDoc中获得add()方法:
If the container has already been
displayed, the hierarchy must be
validated thereafter in order to
display the added component.
更改:
frame.setVisible(true);
new JComboBox();
frame.add(new JButton("text"));
至:
frame.setVisible(true);
new JComboBox();
frame.add(new JButton("text"));
frame.validate();
我认为您遇到的奇怪之处不在于调用"new ()“;而是调用”frame.add(新JButton(“text”));在调用“frame.setVisible(True)”之后调用"frame.setVisible(true);“而不调用"frame.validate();”。
https://stackoverflow.com/questions/13230733
复制