Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确地为框架/面板喷漆?_Java_User Interface - Fatal编程技术网

Java 如何正确地为框架/面板喷漆?

Java 如何正确地为框架/面板喷漆?,java,user-interface,Java,User Interface,我在这门课的最底层尝试了各种各样的变化,但到目前为止没有任何效果。有时候,编辑会使print语句工作,但窗口总是以一个甚至不是我设置的大小打开,并保持空白。我不知道它怎么了。我试图在我的窗口上打印1024个矩形,每次打印之间有一个停顿。这些值是正确的,只是因为某些原因它们没有被绘制。将方法更改为paintComponent似乎也没什么作用。代码很长,因此这里有一个pastebin:。但最重要的是最后: JFrame frm = new TestEnvironment();

我在这门课的最底层尝试了各种各样的变化,但到目前为止没有任何效果。有时候,编辑会使print语句工作,但窗口总是以一个甚至不是我设置的大小打开,并保持空白。我不知道它怎么了。我试图在我的窗口上打印1024个矩形,每次打印之间有一个停顿。这些值是正确的,只是因为某些原因它们没有被绘制。将方法更改为paintComponent似乎也没什么作用。代码很长,因此这里有一个pastebin:。但最重要的是最后:

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的上下文中手动执行

看看: