微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的Java GUI在第一次移动时会“跳跃”?

我有一个简单的Java GUI(下面的代码),由于某种原因,当显示时,将第一次尝试移动或调整它的大小,将“跳转”回到它的原始位置。 所以基本上我必须两次移动gui才能让它移动一次,因为只要我第一次释放鼠标,它就会回到原来的位置。

import javax.swing.*; public class JFrameTester { public static void main(String[] args) { JFrame f = new JFrame("A JFrame"); f.setSize(250,250); f.setLocation(300,200); f.getContentPane().add(new JTextArea(10,40)); //f.pack(); f.setVisible(true); //f.validate(); } }

我正在用java 1.6运行在GNU Linux上 。 我将显示导出到我的Windows机器,并想知道它是否与X11转发有关,因为在Windows中运行gui时它不显示此行为。 但是,当我在Fedora Linux机器上运行这个gui(用java 1.7)时,根本不显示这个行为 – 不pipe是否导出显示

为Linux开发

性能关键的GUI应用程序(Windows,Linux)

Py2exe – 窗口运行后立即消失

Qt 4.8:显示窗口时,QPushButton上的文本被选中

自定义Linux GUI

几个问题很明显:

仅在事件派发线程上构造和操作Swing GUI对象。 如果不这样做,就会造成竞争状况,直到不同的平台或网络延迟暴露出来为止。

使用pack() ,其中“导致此Window大小适合其子组件的首选大小和布局”。 如果不这样做,将导致在移动或调整大小时验证无效Container 。 当过早可见的组件移动到所定义的位置时,它们看起来“跳跃”。

使setVisible()成为影响初始外观的最后一个操作。

以下示例结合了这些建议:

import java.awt.EventQueue; import javax.swing.*; public class JFrameTester { public static void main(String[] args) { EventQueue.invokelater(new Runnable() { @Override public void run() { JFrame f = new JFrame("A JFrame"); f.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); f.add(new JScrollPane(new JTextArea(10,40))); f.pack(); f.setLocationByPlatform(true); f.setVisible(true); } }); } }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐