空指针和私有成员,带swing的基本Java GUI
当我尝试构建下面的程序时,出现以下错误:空指针和私有成员,带swing的基本Java GUI,java,swing,nullpointerexception,Java,Swing,Nullpointerexception,当我尝试构建下面的程序时,出现以下错误: Exception in thread "main" java.lang.NullPointerException at java.awt.Container.addImpl(Unknown Source) at java.awt.Container.add(Unknown Source) at miniCADFrame$CanvasPanel.<init>(miniCADFrame.java:71) at
Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at miniCADFrame$CanvasPanel.<init>(miniCADFrame.java:71)
at miniCADFrame.<init>(miniCADFrame.java:17)
at miniCAD.<init>(miniCAD.java:12)
at miniCAD.main(miniCAD.java:20)
线程“main”java.lang.NullPointerException中的异常
位于java.awt.Container.addImpl(未知源)
位于java.awt.Container.add(未知源)
在miniCADFrame$CanvasPanel。(miniCADFrame.java:71)
在miniCADFrame上。(miniCADFrame.java:17)
在miniCAD。(miniCAD.java:12)
在miniCAD.main(miniCAD.java:20)
很明显,我有一些空指针问题,但我不确定它们在哪里!下面是我认为是问题根源的代码(如果我避免使用下面代码中的类,程序将毫无问题地运行)。我已经为下面的问题点添加了行号
一旦完成,程序将允许用户按下按钮绘制各种形状
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class miniCADFrame extends JPanel {
private CanvasPanel canvas = new CanvasPanel(); //LINE 17
private ButtonPanel buttons = new ButtonPanel();
public miniCADFrame() {
//Constructor, creates the mother panel
this.setLayout(new BorderLayout());
this.add (canvas,BorderLayout.CENTER);
}
private class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) { //Paint the figure associated with the button click
canvas.add(new FigurePanel(FigurePanel.OVAL), BorderLayout.CENTER);
canvas.repaint();
}
}
class ButtonPanel extends JPanel {
private JButton[] Jbuttons = new JButton[11];
//Constructor
ButtonPanel() {
setLayout(new GridLayout(4, 4));
// Create buttons to attach to the buttons panel
Jbuttons[0] = new JButton("Change Colour");
Jbuttons[1] = new JButton("Up");
Jbuttons[2] = new JButton("Text");
Jbuttons[3] = new JButton("Left");
Jbuttons[4] = new JButton("Enlarge");
Jbuttons[5] = new JButton("Right");
Jbuttons[6] = new JButton("Rectangle");
Jbuttons[7] = new JButton("Down");
Jbuttons[8] = new JButton("Circle");
Jbuttons[9] = new JButton("Save");
Jbuttons[10] = new JButton("Load");
//Add the buttons to the buttons panel
for (int i=0; i<11; i++) {
Jbuttons[i].addActionListener(new ButtonListener());
buttons.add(Jbuttons[i]);
}
}
}
class CanvasPanel extends JPanel {
//Constructor
CanvasPanel() {
// Create "canvas" to hold a label for the buttons panel along with the button panel itself
this.setLayout(new BorderLayout());
this.add(new JLabel("CONTROL PANEL"),BorderLayout.NORTH);
this.add(buttons, BorderLayout.WEST); //LINE 71 add the button panel to the canvas panel
//test
this.add(new FigurePanel(FigurePanel.RECTANGLE), BorderLayout.CENTER);
}
}
}
导入java.awt.BorderLayout;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
公共类miniCADFrame扩展了JPanel{
private CanvasPanel canvas=新建CanvasPanel();//第17行
私有按钮面板按钮=新按钮面板();
公共迷你卡框架(){
//构造函数,创建主面板
此.setLayout(新的BorderLayout());
this.add(canvas,BorderLayout.CENTER);
}
私有类ButtonListener实现ActionListener{
@凌驾
public void actionPerformed(ActionEvent事件){//绘制与按钮单击关联的图形
添加(新的FigurePanel(FigurePanel.OVAL),BorderLayout.CENTER);
canvas.repaint();
}
}
类ButtonPanel扩展了JPanel{
私有JButton[]Jbuttons=新JButton[11];
//建造师
按钮面板(){
setLayout(新的GridLayout(4,4));
//创建要附加到按钮面板的按钮
Jbuttons[0]=新JButton(“更改颜色”);
JButton[1]=新JButton(“Up”);
Jbuttons[2]=新JButton(“文本”);
Jbuttons[3]=新JButton(“左”);
Jbuttons[4]=新JButton(“放大”);
JButton[5]=新JButton(“右”);
Jbuttons[6]=新JButton(“矩形”);
Jbuttons[7]=新JButton(“向下”);
JButton[8]=新JButton(“圆”);
Jbuttons[9]=新JButton(“保存”);
Jbuttons[10]=新JButton(“加载”);
//将按钮添加到按钮面板
对于(inti=0;i我认为这是因为您在按钮之前实例化了画布。
buttons变量用于CanvasPanel的构造函数我认为这是因为您在按钮之前实例化了画布。
buttons变量在CanvasPanel的构造函数中使用。您使用的是netbeans吗?按钮。add
按钮是ButtonPanel
,它没有add
方法。@nachokk扩展了JPanel,是吗?@sᴜʀᴇsʜᴀᴛᴛᴀ 不,我使用的是EclipseWhat line是miniCADFrame.java:71
?您使用的是netbeans吗?按钮。add
按钮是ButtonPanel
按钮,它没有add
方法。@nachokk因为它扩展了JPanel,不是吗?@sᴜʀᴇsʜᴀᴛᴛᴀ 不,我正在使用EclipseWhat line isminiCADFrame.java:71
?是的,这是问题之一!谢谢。另一个问题是使用按钮。在按钮的构造函数中添加。按钮在构建之前无法添加,所以我应该做的只是说添加(Jbuttons[I])。一旦我做了这两个更改,它就工作了!是的,这是问题之一!谢谢。另一个问题是使用按钮。在按钮的构造函数中添加。按钮在构建之前无法添加,所以我应该做的只是说添加(Jbuttons[I])。一旦我做了这两个更改,它就工作了!