Etch-A-Sketch с кнопкой смены цвета?
Я попытался добавить кнопку, которая запрашивает цветовую палитру (предоставленную классом, который я искал под названием 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 );
}
}
Все, чего я хочу добиться - это изменить цвет линии в соответствии с выбором цвета пользователем.
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
, Поэтому, когда window.getContentPane()
вызывается изнутри actionPerformed()
, это попытка вызвать метод на null
ссылка, в результате чего NullPointerException
,
Чтобы исправить проблему, вместо объявления локальной переменной в конструкторе, вот так:
JFrame window = new JFrame("Classic Etch a Sketch");
используйте уже объявленную переменную экземпляра:
window = new JFrame("Classic Etch a Sketch");