在设置可见之前向 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 中的 JPanel 内容
java swing编程问题:一个jframe中添加一个jpanel后,为jpanel添加一个滚动条,当jpanel中内容过多时滑动