2015-08-28 2 views
0

Я изучаю Java от HeadFirst Java. Когда я запускаю приложение, он сначала показывает круг. Но когда я нажимаю кнопку, она запускает следующую ошибку. Ниже приведен код и ошибка:Почему я получаю ошибку actionPerformed(): неизвестный источник?

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
public class GUI implements ActionListener { 
JFrame frame; 

public static void main(String[] args) { 
    GUI g = new GUI(); 
    g.go(); 
} 

private void go() { 
    JFrame frame = new JFrame("Title"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JButton button = new JButton("Change Color"); 
    button.addActionListener(this); 

    MyWidget my = new MyWidget(); 

    frame.getContentPane().add(BorderLayout.SOUTH, button); 
    frame.getContentPane().add(BorderLayout.CENTER, my); 
    frame.setSize(300, 300); 
    frame.setVisible(true); 

} 

@Override 
public void actionPerformed(ActionEvent e) { 
    frame.repaint(); 
} 
} 
class MyWidget extends JPanel { 
@Override 
public void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 
    int red = (int) (Math.random() * 255); 
    int green = (int) (Math.random() * 255); 
    int blue = (int) (Math.random() * 255); 
    Color startColor = new Color(red, green, blue); 
    red = (int) (Math.random() * 255); 
    green = (int) (Math.random() * 255); 
    blue = (int) (Math.random() * 255); 
    Color endColor = new Color(red, green, blue); 
    GradientPaint gradient = new GradientPaint(70, 70, startColor, 150, 150, endColor); 
    g2.setPaint(gradient); 
    g2.fillOval(70, 70, 100, 100); 
} 
} 

Вот что я получаю на консоли:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at HeadFirstJava.GUI.actionPerformed(GUI.java:32) 
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) 
+1

Вы затенение своего 'frame' переменным. Вы определяете 'frame' как поле экземпляра класса; 'JFrame frame;', но затем вы объявляете локальную переменную в вашем методе 'go'; 'JFrame frame = new JFrame (« Title »);'. Удалите локальное обновление; 'frame = new JFrame (« Title »);' – MadProgrammer

ответ

2

Ваш JFrame не в рамки, когда вы первый объявить. Измените эту строку:

JFrame frame = new JFrame("Title"); 

к этому:

frame = new JFrame("Title"); 
+0

Как вы можете ответить после того, как он закрыт? – Amila

+0

@Amila Посмотреть: [Как был опубликован этот ответ после закрытия этого вопроса?] (Http://meta.stackexchange.com/q/91922/200235) – durron597

Смежные вопросы