1

こんにちは、Java初心者です。ボタンのクリックでパネルの色を変更する簡単な GUI プログラムを実装しようとしていました。

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

public class Button_lable implements ActionListener {
public JFrame frame;
//JPanel panel;
//JLabel label;

public static void main(String[] args) {

    Button_lable gui = new Button_lable();
    gui.go();
}//end of main
public void go(){
    //System.out.println("Entered Go()");
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JButton b_frame = new JButton("Click to change the color");
    b_frame.addActionListener(this);
    MyDrawpanel d_panel = new MyDrawpanel();

    frame.getContentPane().add(BorderLayout.SOUTH,b_frame);
    frame.getContentPane().add(BorderLayout.CENTER ,d_panel);

    frame.setSize(300, 300);
    frame.setVisible(true);


}//end of go
public void actionPerformed(ActionEvent e) {
    frame.repaint();
}


}//end of Button_lable


class MyDrawpanel extends JPanel {
    public void paintComponent(Graphics g){
Graphics2D grph = (Graphics2D) g;
int red = (int)(Math.random()* 255);
int green = (int)(Math.random()* 255);
int blue = (int)(Math.random()* 255);
Color strt_clr = new Color(red,green,blue);

red = (int)(Math.random()* 255);
green = (int)(Math.random()* 255);
blue = (int)(Math.random()* 255);
Color end_clr = new Color(red,green,blue);

GradientPaint gradient = new GradientPaint(70,70,strt_clr,150,150,end_clr);  
grph.setPaint(gradient);
grph.fillOval(50,25, 150, 150);
  }
}

出力ウィンドウが表示されます。しかし、ボタンをクリックすると、次の例外が発生します。

 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Button_lable.actionPerformed(Button_lable.java:34)
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)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

ご意見をお聞かせください。

敬具。

4

6 に答える 6

2

あなたは決して初期化しないthis.frameので、そうですnull

ではgo()、 という別の変数を作成して初期化しますframe

JFrame frame = new JFrame();

最初の を削除したい場合がありますJFrame:

frame = new JFrame();
于 2013-03-31T07:15:43.077 に答える
0

例外の理由を説明しましょう。

最初の中かっこの下で最初public JFrame frame;に宣言するものには、グローバル スコープがあります。そして、2番目JFrame frame = new JFrame();に初期化すると、その新しいインスタンスが作成されます。go() メソッドで宣言するフレームにはローカルスコープがあり、グローバルスコープではなく初期化します。だからglobal scope instance of frame is uninitializedそれは原因NullPointerExceptionです。

于 2015-07-23T07:21:34.573 に答える
0

と呼ばれる 2 つの変数を宣言しましたframe。1 つはクラス変数で、もう 1 つは内部goです。内部の宣言を削除し、内部goのクラス変数を初期化するだけですgo

public void go(){
    //System.out.println("Entered Go()");
    JFrame frame = new JFrame();

上記を次のように変更します

public void go(){
    //System.out.println("Entered Go()");
    frame = new JFrame();

frameで呼び出される新しい変数を作成しているためgo、クラス変数frameは初期化されません。それは残っnullているので、NullPointerException

于 2013-03-31T07:16:58.910 に答える
0

フレームはヌルです。フレームにはセッターを使用するだけです。何かのようなもの :

void setFrame(JFrame theFrame) {
    this.frame = theFrame;
}

また、frame を 2 回宣言しています。go(); から削除します。

于 2013-03-31T07:17:16.280 に答える
0

この行を変更します。

JFrame frame = new JFrame();

これで:

frame = new JFrame();
于 2013-03-31T07:17:32.843 に答える