Java 如何正确地为框架/面板喷漆?
我在这门课的最底层尝试了各种各样的变化,但到目前为止没有任何效果。有时候,编辑会使print语句工作,但窗口总是以一个甚至不是我设置的大小打开,并保持空白。我不知道它怎么了。我试图在我的窗口上打印1024个矩形,每次打印之间有一个停顿。这些值是正确的,只是因为某些原因它们没有被绘制。将方法更改为paintComponent似乎也没什么作用。代码很长,因此这里有一个pastebin:。但最重要的是最后:Java 如何正确地为框架/面板喷漆?,java,user-interface,Java,User Interface,我在这门课的最底层尝试了各种各样的变化,但到目前为止没有任何效果。有时候,编辑会使print语句工作,但窗口总是以一个甚至不是我设置的大小打开,并保持空白。我不知道它怎么了。我试图在我的窗口上打印1024个矩形,每次打印之间有一个停顿。这些值是正确的,只是因为某些原因它们没有被绘制。将方法更改为paintComponent似乎也没什么作用。代码很长,因此这里有一个pastebin:。但最重要的是最后: JFrame frm = new TestEnvironment();
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();
}
}
}
JFrame frm=新测试环境();
frm.设置尺寸(11521152);
frm.setVisible(真);
JPanel面板=新的JPanel();
frm.添加(面板);
t=0;
i=0;
而(t
感谢根据您的需要,通常从
JComponent
扩展而来的组件的paintComponent
方法中进行绘制
您应该避免覆盖顶级容器(如JFrame
)的paint
,原因有很多,包括它们不是双缓冲区,最终将在窗口装饰下进行绘制,摆动窗口包含许多分层组件,这些组件构成了窗口的可视内容,这意味着你要么在这个内容上画画,要么在这个内容下画画,这会变得一团糟
您不应该处理图形中您自己未创建的上下文
Swing是一个单线程环境,也就是说,任何阻塞线程的东西(例如thread.sleep
)都会阻止它处理新的重绘请求和事件,使程序看起来好像已经停止了
Swing也不是线程安全的。这意味着您需要确保所有更新和与UI的交互都是在事件调度线程的上下文中完成的
动画通常是通过使用javax.swing.Timer
或SwingWorker
来实现的,具体取决于动画的复杂性。您可以使用线程,但这会使问题复杂化,因为您需要确保对UI进行所有更新(直接或以其他方式)在EDT的上下文中手动执行
看看: