Java 尝试从不同类传递颜色参数时获取NullPointerException

Java 尝试从不同类传递颜色参数时获取NullPointerException,java,nullpointerexception,color-scheme,Java,Nullpointerexception,Color Scheme,基本上我在做一个画板,你用鼠标画;有一组要拾取的颜色按钮,它们是在自定义类ColoredButton中创建的,颜色参数由setColor(int r,g,b)设置 因此,在类colortool中,当您单击其中一个coloredbutton时,它会将全局变量selectedCOlor设置为该按钮中设置的颜色(如上所述),然后DrawBoard类使用getColor()获取colortool类中“selectedCOlor”变量中的颜色 我遇到的问题是,我在DrawBoard中得到了一个NullP

基本上我在做一个画板,你用鼠标画;有一组要拾取的颜色按钮,它们是在自定义类ColoredButton中创建的,颜色参数由setColor(int r,g,b)设置

因此,在类colortool中,当您单击其中一个coloredbutton时,它会将全局变量selectedCOlor设置为该按钮中设置的颜色(如上所述),然后DrawBoard类使用getColor()获取colortool类中“selectedCOlor”变量中的颜色

  • 我遇到的问题是,我在DrawBoard中得到了一个NullPointerException,因此color参数从未出现过,我已经尝试过类似的方法,如代码中所示,但都显示了NullPointerException
以下是类(我拿出了不需要的代码):

下一节课:

public class ColourToolbar extends JPanel implements ActionListener{

public Color selectedColor;
public boolean colorSelected = false;

public ColoredButton pink,black,blue,green,orange,yellow,darkp,red,white;

public ColourToolbar(){

    setBackground(Color.DARK_GRAY);

    setLayout(new GridBagLayout());

    Dimension size = getPreferredSize();
    size.setSize(1024,80); //w, h
    setPreferredSize(size);

    // NOTE: There are 8 more blocks of codes like the one below, left for example.

    ImageIcon blackicon = new ImageIcon(getClass().getResource("Icons/Colours/Black.png"));
        black = new ColoredButton(new ImageIcon(blackicon.getImage().getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH)));
        gbc.gridx = 7;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weightx = 0.5;    
        black.setColor(255, 255, 255);
        black.setOpaque(false);
        black.setContentAreaFilled(false);
        black.setBorderPainted(false);
        black.setActionCommand("orange");
        black.addActionListener(this);
        gbc.insets = new Insets(0,0,0,0); //top, left, bottom, right
        add(black, gbc);


}

@Override
public void actionPerformed(ActionEvent e){

    // all colors: black, blue, green, orange, *pink, yellow, darkpink, *red, white

    if("black".equalsIgnoreCase(e.getActionCommand())){

        this.selectedColor = black.getColor();
        System.out.println("black= " + selectedColor.toString());
        this.colorSelected = true;
    }      
}

public Color getCurrColor(){

    return this.selectedColor;
}


}
我得到NullPointerException的最后一个类:

public class DrawBoard extends JPanel implements MouseListener, MouseMotionListener{

public JLabel status;
private JLabel imgLabel; // this is where the drawing happens
private List<Point> points = new ArrayList<Point>();
private List<BufferedImage> lines = new ArrayList<BufferedImage>();

private static final int BI_WIDTH = 1024;
private static final int BI_HEIGHT = 800;

private BufferedImage bImage = new BufferedImage(BI_WIDTH, BI_HEIGHT,
        BufferedImage.TYPE_INT_ARGB);

public Color currentColor;

public DrawBoard(){  

   Graphics2D g2d = bImage.createGraphics();
   g2d.dispose();

    Dimension size = getPreferredSize();
    size.setSize(1024,800); //w, h
    setPreferredSize(size);
    status =  new JLabel("default");
    add(status, BorderLayout.SOUTH);
    addMouseListener(this);
    addMouseMotionListener(this);  


     imgLabel = new JLabel(new ImageIcon(bImage)) {
     @Override
     protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        paintInLabel(g);
     }
   };
     imgLabel.setOpaque(false);
     setOpaque(false);
      add(imgLabel, BorderLayout.CENTER);

}

private void paintInLabel(Graphics g) {
  Graphics2D g2d = (Graphics2D) g;
  g2d.setColor(getColor()); // this colour is when mouse is pressed
  g2d.setStroke(new BasicStroke(5));
  if (points.size() < 2) {
     return;
  }
  for (int i = 1; i < points.size(); i++) {
     int x1 = points.get(i - 1).x;
     int y1 = points.get(i - 1).y;
     int x2 = points.get(i).x;
     int y2 = points.get(i).y;
     g2d.drawLine(x1, y1, x2, y2);
  }
}

// Where the drawing happens
@Override
public void mousePressed(MouseEvent e) {
    status.setText("you pressed down the mouse");
    this.pstart = e.getPoint();
    points.add(e.getPoint());

}

@Override
public void mouseDragged(MouseEvent e) {
  status.setText("you draged the mouse");
  points.add(e.getPoint());
  imgLabel.repaint();
}

@Override
public void mouseReleased(MouseEvent e) {
    status.setText("you release the mouse click");
    Graphics2D g2d = bImage.createGraphics();
    g2d.setColor(getColor()); // this is the final colour - 
    g2d.setStroke(new BasicStroke(5));

     if (points.size() >= 2) {
        for (int i = 1; i < points.size(); i++) {
           int x1 = points.get(i - 1).x;
           int y1 = points.get(i - 1).y;
           int x2 = points.get(i).x;
           int y2 = points.get(i).y;
           g2d.drawLine(x1, y1, x2, y2);
        }
     }
     g2d.dispose();

     points.clear();
     imgLabel.repaint();

}
// End of where the drawing happens


// BELOW IN THIS METHOD IS WHERE it gets the NullPointerException
private Color getColor() {
    ColourToolbar ct = new ColourToolbar();
    System.out.println(ct.getCurrColor().toString());

    return  ct.getCurrColor();
}

private void setColor(Color col){

    this.currentColor = col;
}

}

好的,这就是问题所在:

ColourToolbar ct = new ColourToolbar();
System.out.println(ct.getCurrColor().toString());
getCurrColor()
返回
colorToolbar
中的
selectedColor
。。。但是您没有选择的
颜色
。。。构造函数没有将其设置为任何值。因此,该值为
null
,当您调用
toString()
时,您将得到异常

在你的描述中,你说:

它设置一个全局变量selectedCOlor

但是
selectedColor
不是一个“全局”变量——它是一个实例变量;每个
colortoolbar
实例都有一个单独的
selectedColor
变量


为什么你要在一个新的
彩色工具栏上这样做?你真的不想从现有的工具栏中获取所选的颜色吗?或者,如果您确实希望它是全局的(ick),它应该是一个静态变量,由静态方法获取,而无需创建新实例。

好的,这就是问题所在:

ColourToolbar ct = new ColourToolbar();
System.out.println(ct.getCurrColor().toString());
getCurrColor()
返回
colorToolbar
中的
selectedColor
。。。但是您没有选择的
颜色
。。。构造函数没有将其设置为任何值。因此,该值为
null
,当您调用
toString()
时,您将得到异常

在你的描述中,你说:

它设置一个全局变量selectedCOlor

但是
selectedColor
不是一个“全局”变量——它是一个实例变量;每个
colortoolbar
实例都有一个单独的
selectedColor
变量


为什么你要在一个新的
彩色工具栏上这样做?你真的不想从现有的工具栏中获取所选的颜色吗?或者,如果您真的希望它是全局的(ick),它应该是一个静态变量,由静态方法获取,而无需创建任何新实例。

代码太多且未发布堆栈跟踪?哪条线吹了?你能举个简单的例子吗?我想没有必要用鼠标听器。所以,删除它,如果你仍然得到你的错误,尝试,并张贴一个简短的例子。您的源代码中还有一些行似乎不相关。添加堆栈跟踪,将清除更多代码太多代码且未发布堆栈跟踪?哪条线吹了?你能举个简单的例子吗?我想没有必要用鼠标听器。所以,删除它,如果你仍然得到你的错误,尝试,并张贴一个简短的例子。您的源代码中还有一些行似乎不相关。添加堆栈跟踪,将清理更多的代码println用于调试,因为我想在颜色出现时打印,因为它不会更改图形的颜色(显然)。我创建了新的ColorToolbar,因为我无法扩展该类以获取“selectedColor”变量。我可以用什么方法来表示该变量?从DrawBoard类,也就是说。这让我有点困惑,我该如何从该实例获取selectedColor,或者如何将实例对象从该Color工具栏发送到DrawBoard?@ChristianFeo:嗯,很难回答这些问题,因为它们没有太多意义。我认为您需要考虑是否希望
colortoolbar.selectedColor
是一个静态变量还是一个实例变量。。。如果希望它是一个实例变量,则需要创建一个实例,并将其用于选择和获取。(例如,
DrawBoard
应该有一个
colortoolbar
作为实例成员。)我使用了static和
colortoolbar。selectedColor
完成了这项工作,我确实理解了为什么它以前不工作。谢谢println是为调试而做的,因为我想在颜色出现时打印,因为它不会改变图形的颜色(显然)。我创建了新的ColorToolbar,因为我无法扩展该类以获取“selectedColor”变量。我可以用什么方法来表示该变量?从DrawBoard类,也就是说。这让我有点困惑,我该如何从该实例获取selectedColor,或者如何将实例对象从该Color工具栏发送到DrawBoard?@ChristianFeo:嗯,很难回答这些问题,因为它们没有太多意义。我认为您需要考虑是否希望
colortoolbar.selectedColor
是一个静态变量还是一个实例变量。。。如果希望它是一个实例变量,则需要创建一个实例,并将其用于选择和获取。(例如,
DrawBoard
应该有一个
colortoolbar
作为实例成员。)我使用了static和
colortoolbar。selectedColor
完成了这项工作,我确实理解了为什么它以前不工作。谢谢
ColourToolbar ct = new ColourToolbar();
System.out.println(ct.getCurrColor().toString());