所以我试图创建一个Canvas,并重写内联的paint方法,但是我在Canvas上得到了一个NullPointerException'图形。
Canvas c = new Canvas(){
@Override
public void paint(Graphics g){
g.setColor(Color.BLACK);
g.drawString("Canvassed Window", 100, 100);
}
};
NullPointerException来自
g.setColor(Color.BLACK);
我要创建一个继承自Canvas的新类,但我想知道是否有人知道它正在这样做的原因。我怀疑它是因为Canvas还没有被初始化。
我也想知道是否有人知道它的解决方法,我试着写一些看起来像
的东西private boolean isInit = false;
init(){
isInit = true;
}
然后在paint方法中在顶部放置一行代表
if(!isInit) return;
但是当我稍后尝试调用init时,它并不想知道,它只是错误并说init不在Canvas类中,我猜我只能覆盖这种方法。
编辑:
我有一个Window类
import java.awt.Canvas;
import java.awt.Frame;
@SuppressWarnings("serial")
public class Window extends Frame{
public Window(int width, int height, int locationX, int locationY) {
setSize(width, height);
setLocation(locationX, locationY);
setResizable(false);
setTitle("Window");
setVisible(true);
}
public Window(int width, int height, int locationX, int locationY, String title){
Window w = new Window(width, height, locationX, locationY);
w.setTitle(title);
}
public Window(int width, int height, int locationX, int locationY, String title, Canvas c){
Window w = new Window(width, height, locationX, locationY, title);
w.add(c);
}
}
这是我的主要方法,我在其中创建一个新的Window实例:
public static void main(String[] args){
Canvas c = new Canvas(){
@Override
public void paint(Graphics g){
g.setColor(Color.BLACK);
g.drawString("Canvassed Window", 100, 100);
}
};
new Window(800, 600, 200, 100, "CanvassedWindow", c);
}
我正在获得一个窗口或#34; Frame"出现,正确的尺寸,尺寸和标题,但它似乎没有绘制字符串,并且有一个NPE。我没有做任何其他事情,我所拥有的只是我主要方法的包装类。
答案 0 :(得分:1)
因此,根据您的示例,Window
类将创建三个新窗口,其中只有一个可见,而不是您将Canvas
添加到...
当您致电new Window(800, 600, 200, 100, "CanvassedWindow", c);
时,会创建Window
(JFrame
)的新实例,这是#1窗口,但它不可见......
public Window(int width, int height, int locationX, int locationY, String title, Canvas c)
构造函数然后创建另一个Window
(JFrame
)实例,这是#2窗口,但它不可见......
然后调用public Window(int width, int height, int locationX, int locationY, String title)
,这会创建另一个Window
,这实际上是可见的...... {/ p>
这是因为构造函数Window w = new Window(width, height, locationX, locationY);
是唯一一个实际设置框架属性并使其可见的构造函数...
这可能导致一些奇怪的道路......它确实对我有用......
相反,你应该链接你的构造函数,例如......
public class Window extends Frame{
public Window(int width, int height, int locationX, int locationY) {
setSize(width, height);
setLocation(locationX, locationY);
setResizable(false);
setTitle("Window");
setVisible(true);
}
public Window(int width, int height, int locationX, int locationY, String title){
this(width, height, locationX, locationY);
setTitle(title);
}
public Window(int width, int height, int locationX, int locationY, String title, Canvas c){
this(witdth, height, locationX, locationY, title);
add(c);
}
}