提问人:Tomek 提问时间:11/11/2008 更新时间:11/25/2016 访问量:3935
在 Java Swing 库中使用带有面板的图形时出现的问题
Problems using Graphics with Panels in the Java Swing Library
问:
大家好,我正在尝试运行以下程序,但收到 NullPointerException。我是 Java swing 库的新手,所以我可能会做一些非常愚蠢的事情。无论哪种方式,这是我的两个职业,我现在只是在玩,我想做的就是画一个该死的圆圈(我不想画一个绞刑架,最后上面有一个刽子手)。
package hangman2;
import java.awt.*;
import javax.swing.*;
public class Hangman2 extends JFrame{
private GridLayout alphabetLayout = new GridLayout(2,2,5,5);
private Gallow gallow = new Gallow();
public Hangman2() {
setLayout(alphabetLayout);
setSize(1000,500);
setVisible( true );
}
public static void main( String args[] ) {
Hangman2 application = new Hangman2();
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
package hangman2;
import java.awt.*;
import javax.swing.*;
public class Gallow extends JPanel {
private Graphics g;
public Gallow(){
g.fillOval(10, 20, 40, 25);
}
}
NullPointerException 位于 g.fillOval 行。
提前致谢,
托梅克
答:
4赞
sblundy
11/11/2008
#1
您获得 NPE,因为未设置,因此,它是 .此外,您不应该在构造函数中进行绘图。改为重载 paintComponent(Graphics g)。
g
null
public class Gallow extends JPanel {
public paintComponent(Graphics g){
g.fillOval(10, 20, 40, 25);
}
}
我还会研究 BufferedImage。
评论
0赞
Tomek
11/11/2008
我明白了,所以我猜每次创建 JPanel 时都会调用 paintComponent。
0赞
sblundy
11/11/2008
实际上,每次重绘组件时都会调用它。Swing 不会记住每个组件的外观,而是每个组件负责根据需要绘制和重绘自身。
0赞
Vincent Ramdhanie
11/11/2008
#2
有几件事:不要忘记将面板添加到 .并覆盖您的自定义绘画方法。您不需要声明 Graphics 对象,因为 的 paint 方法在任何情况下都会引用一个对象。JFrame
paint()
JPanel
JPanel
package hangman2;
import java.awt.*;
import javax.swing.*;
public class Hangman2 extends JFrame{
private GridLayout alphabetLayout = new GridLayout(2,2,5,5);
private Gallow gallow = new Gallow();
public Hangman2() {
setLayout(alphabetLayout);
add(gallow, BorderLayout.CENTER);//here
setSize(1000,500);
setVisible( true );
}
public static void main( String args[] ) {
Hangman2 application = new Hangman2();
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
package hangman2;
import java.awt.*;
import javax.swing.*;
public class Gallow extends JPanel {
public Gallow(){
super();
}
public void paint(Graphics g){
g.fillOval(10, 20, 40, 25);
}
}
评论
0赞
Steve McLeod
9/4/2009
您应该覆盖 paintComponent,而不是 paint
评论