在设置可见之前向 JFrame 添加内容

Posted

技术标签:

【中文标题】在设置可见之前向 JFrame 添加内容【英文标题】:Adding Contents to JFrame Before Setting Visible 【发布时间】:2014-08-02 17:00:50 【问题描述】:

我有一个在主函数中创建的 JFrame。我想向它添加一个 JTextField。我遇到的问题是创建了 JFrame,然后 - 大约有第二个延迟 - 添加了 JTextField。有没有办法可以将文本字段绘制到我的窗口然后一次显示?提前致谢!

供参考,这是我的代码:

public class Window 

public static final JFrame window = new JFrame();
public static final JTextField input = new JTextField();

private static void loadWindow()

    window.setSize(800, 600);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setLayout(new FlowLayout());
    input.setPreferredSize(new Dimension(400, 60));

    window.add(input);
    window.setVisible(true);



public static void main(String[] args)

    loadWindow();




这是发生的时间线:

第一秒:

第二次:

【问题讨论】:

在这个 sn-p 中没有任何部分指出正在发生一些延迟的事实。虽然如果您尝试将控件添加到 JFrame 或已经可见的 JFrame,那么在添加组件后尝试 frame.pack() 就足够了,恕我直言。 JFrame 是不可见的,和例子中的完全一样。我不知道为什么会出现这种延迟。我使用的是 Mac OSX,JFrame 在文本字段之前可见。 您是在Event Dispatcher Thread-EDT 上运行 Swing 的代码,而不是从主线程运行吗?如果frame.setVisible(true) 是最后一次调用,那么,我以前从未见过这样的东西,一个可运行的小例子会很有帮助:-) 请看一下编辑。 尝试在 loadWindow() 方法中实例化 JFrame 和 JTextField。即在他们身上而不是在课堂上调用 new ..() 。也不太清楚为什么这些会是最终的。 【参考方案1】:

将此归为怪异...

我变了

public static final JTextField input = new JTextField();

public static final JTextField input = new JTextField(20);

而且效果很好……

不过我会鼓励你...

避免使用setPreferredSize,因为它并不总是适用于每个平台,因为您无法控制渲染管道,这会影响组件正确渲染所需的空间量 在 EDT 中启动您的 UI...

例如...

EventQueue.invokeLater(new Runnable() 
    @Override
    public void run() 
        try 
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
         catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) 
            ex.printStackTrace();
        

        loadWindow();
    
);

【讨论】:

【参考方案2】:

我不相信您会希望 JFrame 和 JTextField 具有最终访问修饰符。 How final keyword works 尝试删除这些。

【讨论】:

这并不能解决问题。 最后简单的租客说值不能重新赋值【参考方案3】:

使用 setSize() 来配置组件的大小。 setPreferrredSize() 将在未知时间或您在组件上调用 pack 时应用。

【讨论】:

一旦窗口被实现,布局管理器将被调用来执行布局,丢弃你对setSize所做的任何更改 您的权利。我倾向于使用 null 作为布局。这就是 setSize() 的作用。 “我倾向于使用 null 作为布局。” -1.在您发现null 布局的陷阱之前,请停止在 Java GUI 构建上制作 cmets。

以上是关于在设置可见之前向 JFrame 添加内容的主要内容,如果未能解决你的问题,请参考以下文章

JFrame的层次结构以及背景颜色设置问题

在单击按钮时创建的项目在 JFrame 中不可见

使用框架状态变量更新 JFrame 中的 JPanel 内容

java swing编程问题:一个jframe中添加一个jpanel后,为jpanel添加一个滚动条,当jpanel中内容过多时滑动

UISearchBar 在向下滚动之前不可见

如何向java jframe中添加下拉列表 按钮 文本框 最后把信息存储在文件里