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