【问题标题】:Etch-A-Sketch with a changing color button?带有更改颜色按钮的 Etch-A-Sketch?
【发布时间】:2013-06-26 22:39:23
【问题描述】:

我尝试添加一个按钮,该按钮会提示调色板(由我查找的名为 JColorChooser 的类提供)来更改所绘制线条的颜色。单击按钮(我将其命名为“更改颜色”)并从调色板中选择一种颜色并尝试重绘后,线条的颜色仍然是黑色,并且此消息会在我的控制台上弹出:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Etch_A_Sketch.actionPerformed(Etch_A_Sketch.java:45)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)

等等...列表还在继续

这是我目前所拥有的代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Etch_A_Sketch implements MouseListener, MouseMotionListener, ActionListener
{
    JFrame window;
    Container content;
    int mouseX,mouseY,oldX,oldY;
    JLabel coords;
    JButton color;
    Color lineColor = Color.black;


    public Etch_A_Sketch()
    {
        JFrame window = new JFrame("Classic Etch a Sketch");
        content = window.getContentPane();
        content.setLayout( new FlowLayout() );
        color = new JButton("Change color");
        color.addActionListener(this);

        coords = new JLabel();
        coords.setFont(new Font("TimesRoman", Font.ITALIC + Font.BOLD, 32));

        content.add(color);
        content.add( coords); 
        content.addMouseListener(this);
        content.addMouseMotionListener(this);
        window.setSize(640,480);
        window.setVisible(true);
    }

    public void actionPerformed( ActionEvent e)
    {
        if(e.getSource() == color)
        {
            lineColor = JColorChooser.showDialog(window, "Pick a color", lineColor);
            if(lineColor != null)
            {
                window.getContentPane().setBackground(lineColor);
            }
        }
    }

    public void mouseClicked( MouseEvent me)
    {
        mouseX = me.getX();
        mouseY = me.getY();
        reportCoords("Mouse clicked at: " + mouseX + "," + mouseY);

    }
    public void mousePressed( MouseEvent me)
    {
        mouseX = me.getX();
        mouseY = me.getY();
        reportCoords("Mouse Pressed at: " + mouseX + "," + mouseY);

    }

    public void mouseReleased( MouseEvent me)
    {
        mouseX = me.getX();
        mouseY = me.getY();
        reportCoords("Mouse released at: " + mouseX + "," + mouseY);

    }

    public void mouseExited( MouseEvent me)
    {
        mouseX = me.getX();
        mouseY = me.getY();
        reportCoords("Mouse exited at: " + mouseX + "," + mouseY);

    }

    public void mouseEntered( MouseEvent me)
    {
        mouseX = me.getX();
        mouseY = me.getY();
        reportCoords("Mouse Entered at: " + mouseX + "," + mouseY);

    }

    public void mouseDragged( MouseEvent me)
    {
        mouseX = me.getX();
        mouseY = me.getY();

        if (oldX ==0 )
        {
            oldX=mouseX;
            oldY=mouseY;
            return;
        }

        Graphics g = content.getGraphics();
        g.drawLine( oldX,oldY, mouseX, mouseY );
        oldX = mouseX;
        oldY = mouseY;
        reportCoords("Mouse Dragged at: " + mouseX + "," + mouseY);

    }

    public void mouseMoved( MouseEvent me)
    {
        mouseX = me.getX();
        mouseY = me.getY();
        reportCoords("Mouse Moved at: " + mouseX + "," + mouseY);

}



// ..............................................................


    public static void main( String[] args)
    {
        new Etch_A_Sketch();
    }

    private void reportCoords( String msg )
    {
        coords.setText( msg ); 
    }
}

我想要实现的只是能够将线条的颜色更改为用户的颜色选择。

【问题讨论】:

  • 您给定代码的第 45 行似乎是一个空行。您没有包含所有代码吗?第 45 行是什么?
  • 我发布了我拥有的所有内容。我认为 actionPerformed() 方法是我的问题的根源,但我真的不知道你说的空行是什么意思。
  • 第 45 行是 actionPerformed() 方法的右大括号之后的行。
  • 别管我的cmets。我想通了。

标签: java nullpointerexception jbutton jcolorchooser


【解决方案1】:

您在构造函数中的代码:

public Etch_A_Sketch()
{
    JFrame window = new JFrame("Classic Etch a Sketch");
    content = window.getContentPane();
    content.setLayout( new FlowLayout() );
    color = new JButton("Change color");
    color.addActionListener(this);

    coords = new JLabel();
    coords.setFont(new Font("TimesRoman", Font.ITALIC + Font.BOLD, 32));

    content.add(color);
    content.add( coords); 
    content.addMouseListener(this);
    content.addMouseMotionListener(this);
    window.setSize(640,480);
    window.setVisible(true);
}

这一行:

JFrame window = new JFrame("Classic Etch a Sketch");

在构造函数中创建一个名为window 的局部变量。因此,所有初始化都对局部变量进行,当构造函数终止时,局部变量超出范围。 actionPerformed() 方法使用尚未初始化的实例变量,因此使用了null。因此,当从actionPerformed() 中调用window.getContentPane() 时,它是在尝试调用null 引用上的方法,从而导致NullPointerException

要解决这个问题,而不是在构造函数中声明一个局部变量,像这样:

JFrame window = new JFrame("Classic Etch a Sketch");

使用已经声明的实例变量:

window = new JFrame("Classic Etch a Sketch");

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2020-08-03
    • 2014-07-11
    相关资源
    最近更新 更多