首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在JComboBox使JButton消失后创建JButton

在JComboBox使JButton消失后创建JButton
EN

Stack Overflow用户
提问于 2012-11-05 11:01:29
回答 3查看 361关注 0票数 1

在创建JFrame和添加一些组件时,我注意到,如果在设置JFrame可视按钮和添加按钮之间创建JComboBox实例,则按钮将消失。

我首先创建一个JFrame:

代码语言:javascript
代码运行次数:0
运行
复制
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 200);

然后添加设置为可见的框架并添加一个JButton:

代码语言:javascript
代码运行次数:0
运行
复制
frame.setVisible(true);
frame.add(new JButton("text"));

它按预期工作,并显示一个大按钮:

但是,如果我在这些行之间创建JComboBox的一个实例:

代码语言:javascript
代码运行次数:0
运行
复制
frame.setVisible(true);
new JComboBox();
frame.add(new JButton("text"));

现在纽扣不见了..。

我希望没有任何改变,因为我只是创建一个实例,而不是将它分配给任何东西。

为什么按钮会消失?

此外,如果将new JComboBox();移动到frame.setVisible(true);上方,则该按钮再次可见。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-05 11:07:17

一旦显示了UI,就不应该从除EDT之外的任何线程修改它。在第一种情况下,你有一些“运气”,这是有效的。在第二种情况下,创建JComboBox的时间很长,足以阻止您从不是EDT的线程修改UI。

您应该做的是调用EDT上的代码:

代码语言:javascript
代码运行次数:0
运行
复制
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);
    }
})
票数 3
EN

Stack Overflow用户

发布于 2012-11-05 11:20:00

我发现问题在于在向setSize();添加组件之前调用的setVisible(true);方法和JFrame方法。因此,答案很简单,在代码末尾调用setSize();setVisible(true) (或者更好的方法是调用pack();而不是setSize()),一切都应该运行良好:

代码语言:javascript
代码运行次数:0
运行
复制
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);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2012-11-05 11:28:41

从JavaDoc中获得add()方法:

代码语言:javascript
代码运行次数:0
运行
复制
If the container has already been
displayed, the hierarchy must be 
validated thereafter in order to
display the added component.

更改:

代码语言:javascript
代码运行次数:0
运行
复制
frame.setVisible(true);
new JComboBox();
frame.add(new JButton("text"));

至:

代码语言:javascript
代码运行次数:0
运行
复制
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();”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13230733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档