我已尝试过本课程底部的所有内容的多种变体,到目前为止没有任何作用。偶尔编辑会导致print语句工作,但窗口的打开大小甚至不是我设置的大小并保持空白。我不知道它有什么问题。我试图在我的窗口上打印1024个矩形,每次打印之间都有一个暂停。价值是正确的,他们只是因为某种原因没有被绘画。将方法更改为paintComponent似乎也没有做太多。代码很长,所以这里是一个pastebin:http://pastebin.com/ridipz3X。最重要的事情是在最后:
JFrame frm = new TestEnvironment();
frm.setSize(1152, 1152);
frm.setVisible(true);
JPanel panel = new JPanel();
frm.add(panel);
t = 0;
i = 0;
while (t < x - 1) {
panel.repaint();
j++;
t++;
Thread.sleep(10000);
}
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
}
public void paint(Graphics g) {
g.setColor(Color.black);
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(getForeground());
try {
for (int h = 0; h < 1152; h++) {
g.drawRect(h, 0, (int) (((ampArray[h][j]) / maxFreq) * 1152),
1);
g.fillRect(h, 0, (int) (((ampArray[h][j]) / maxFreq) * 1152),
1);
System.out.println(ampArray[h][j]);
}
} finally {
g.dispose();
}
}
}
由于
答案 0 :(得分:0)
绘画通常是在paintComponent
范围内的JComponent
方法内完成的,该方法从JPanel
延伸,通常为paint
,具体取决于您的需求。
你应该避免覆盖JFrame
这样的顶级容器dispose
,原因有很多,包括它们不是双缓冲的,你最终会在窗口装饰下绘画,Swing windows包含一些分层组件构成了窗口的可视内容,这意味着你要么在这个内容上面或下面画画,这只会变得混乱。
您永远不应该Graphics
Thread.sleep
上下文中没有自己创建。
Swing是一个单线程环境,也就是说,任何阻塞线程的东西(例如javax.swing.Timer
)都会阻止它处理新的重绘请求和事件,使它看起来像程序已停止。
Swing也不是线程安全的。这意味着您需要确保所有更新和与UI的交互都是在事件调度线程的上下文中完成的。
动画通常通过使用SwingWorker
或Thread
来实现,具体取决于动画的复杂程度。您可以使用{{1}},但这会使问题变得复杂,因为您需要确保对UI(直接或其他)的所有更新都是在EDT的上下文中手动完成的。
看看: