做
setVisible你最后一件事…
public void buildGUI1() throws NullPointerException { setTitle("Hauptmenü"); setSize(800, 480); setLayout(new GridLayout()); setAlwaysonTop(false); setLocation((Toolkit.getDefaultToolkit().getScreenSize().width) / 4, (Toolkit.getDefaultToolkit().getScreenSize().height) / 4); setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); setResizable(false); final JButton startclickbt = new JButton("Start Clicker"); startclickbt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); if (klick == null) { klick = new Clicker(); add(klick); // Add this when you need to add/remove components revalidate(); repaint(); } } }); add(startclickbt); // Move to here setVisible(true);}
另外,在添加新组件时,使用
revalidate()和
repaint()鼓励容器更新其布局。
建议:
- 确保您的用户界面在EDT上下文中启动,有关更多详细信息,请参见初始线程。
- 避免直接从顶级容器(如)扩展
Jframe
,而应考虑JPanel
在基础容器中使用a 。这样可以将您的UI释放到更多用例中,并防止您被锁定(因为您无法将框架添加到其他框架) - 使用多个Jframe,良好/不良做法?
更新
你有两个直接的问题
Clicker
从扩展Jframe
,但是您尝试将其添加到另一个容器中,这在Swing中是不可能的,并且会导致异常,但是…- 您正在使用
while (true)
循环来阻塞事件调度线程,这意味着Swing无法处理任何新事件,包括repaint
事件
例如…
public Clicker(boolean visible) { buildGUI(visible); j = new Click(false).addPosition(new Point((Toolkit.getDefaultToolkit().getScreenSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height) / 2)).addPosition(new Point(getLocation().x + 1, getLocation().y + 20)); // This is bad while (true) { j.runClicks(getDelay()); }}public Clicker() { buildGUI(true); j = new Click(false).addPosition(new Point((Toolkit.getDefaultToolkit().getScreenSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height) / 2)).addPosition(new Point(getLocation().x + 1, getLocation().y + 20)); // This is bad while (true) { j.runClicks(getDelay()); }}
现在,
Click看起来好像它的UI组件带来了很多其他问题,但是我们没有相应的代码,因此无法注释。
立即的解决方案可能是使用:
SwingWorker
,请参阅工作线程和SwingWorker了解更多详细信息Swing
Timer
,有关更多详细信息,请参见如何使用Swing计时器普通老
Thread
要记住的事情
- Swing(像大多数UI框架一样)是单线程的,任何阻塞该线程的事物(如永无休止的循环)都将阻止它处理新事件,包括绘画事件,这会使您的应用程序看起来像是“挂起”,因为它具有
- 摆动不是线程安全的。与UI的所有交互都必须在事件分发线程的上下文内进行。无论
SwingWorker
和SwingTimer
提供安全更新UI的能力。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)