如何正确地绘制到框架/面板?

时间:2014-02-09 23:39:45

标签: java user-interface

我已尝试过本课程底部的所有内容的多种变体,到目前为止没有任何作用。偶尔编辑会导致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();
                }
        }
}

由于

1 个答案:

答案 0 :(得分:0)

绘画通常是在paintComponent范围内的JComponent方法内完成的,该方法从JPanel延伸,通常为paint,具体取决于您的需求。

你应该避免覆盖JFrame这样的顶级容器dispose,原因有很多,包括它们不是双缓冲的,你最终会在窗口装饰下绘画,Swing windows包含一些分层组件构成了窗口的可视内容,这意味着你要么在这个内容上面或下面画画,这只会变得混乱。

您永远不应该Graphics Thread.sleep上下文中没有自己创建。

Swing是一个单线程环境,也就是说,任何阻塞线程的东西(例如javax.swing.Timer)都会阻止它处理新的重绘请求和事件,使它看起来像程序已停止。

Swing也不是线程安全的。这意味着您需要确保所有更新和与UI的交互都是在事件调度线程的上下文中完成的。

动画通常通过使用SwingWorkerThread来实现,具体取决于动画的复杂程度。您可以使用{{1}},但这会使问题变得复杂,因为您需要确保对UI(直接或其他)的所有更新都是在EDT的上下文中手动完成的。

看看: