我想在JFrame
窗口中绘制一个矩形,但我总是遇到nullpointer
错误。
为什么会这样?什么是绘制图形的最佳(正确)方式,如矩形,渐变等,或者像秋天的积雪一样?
这是例外:
Exception in thread "Thread-0" java.lang.NullPointerException
at gui.Window.run(Window.java:24)
at gui.Window$1.run(Window.java:34)
at java.lang.Thread.run(Unknown Source)
来源:
public class Window extends JFrame implements Runnable {
private boolean run = true;
public Window() {
super.setSize(500, 500);
super.setTitle("MY GUI");
super.setDefaultCloseOperation(EXIT_ON_CLOSE);
super.setContentPane(new Container());
}
@Override
public void run() {
Graphics g = super.getContentPane().getGraphics();
while (this.run) {
g.setColor(new Color(0, 0, 0, 255));
g.fillRect(0, 0, 200, 200);
}
}
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
Window window = new Window();
window.run();
}
}).start();
}
}
错误第24行:
g.setColor(new Color(0, 0, 0, 255));
为什么这样做?
答案 0 :(得分:7)
您发布的代码毫无意义。
首先,每次与Swing组件的交互(除了对repaint()
的调用)都必须在事件派发线程中完成。
其次,运行一个无限循环是没有意义的,它会不断地在Graphics上绘制相同的东西。
第三,这不是它的工作原理。您无法获取与组件关联的图形并在其上绘制。相反,您必须覆盖Swing组件的paintComponent(Graphics)
方法,等待swing调用此方法,并使用提供的Graphics参数绘制您想要的任何内容。如果要更改正在绘制的内容,则需要在此元素上调用repaint()
。不要用JFrame做到这一点。创建JComponent或JPanel的子类,并将子类的实例添加到JFrame,然后使此JFrame可见:
public class CustomComponent extends JComponent {
@Override
public void paintComponent(Graphics g) {
// paint here
}
@Override
public Dimension getPreferredSize() {
// return preferred size here
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame();
f.add(new CustomComponent());
f.pack();
f.setVisible(true);
}
});
}
}
答案 1 :(得分:0)