-1

私はJavaを学んでいる新しいCSの学生です。ユーザーが数字を入力して結果を表示するGUIを作成しようとしています。しかし、よくわからないエラーが発生します。Google で検索してみましたが、役に立ちませんでした。どんなコメントでも大歓迎です。ありがとう。

person クラスの Main メソッド

   import javax.swing.JFrame;
    public class person {
        public static void main(String[] args) {
            JFrame frame= new guifirst();//line 6
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }

ギファーストクラス

import javax.swing.JFrame;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTextField;
public class guifirst extends JFrame{
    private JLabel label;
    private JLabel label1;
    private JTextField text;
    private JButton button;
    private JPanel panel;

    public guifirst(){
        label=new JLabel("Enter a number");
        setSize(450,100);
        text=new JTextField(15);
        button=new JButton("Calculate");

        class addaction implements ActionListener{
            public void actionPerformed(ActionEvent event){
                double number=Double.parseDouble(text.getText());
                double result=number*number;
                label1=new JLabel("Your result is"+result);
            }
        }

        ActionListener listener=new addaction();
        button.addActionListener(listener);
        panel=new JPanel();
        panel.add(label);
        panel.add(label1);//line 32
        panel.add(text);
        panel.add(button);
        add(panel);
    }
}

エラー:

 Exception in thread "main" java.lang.NullPointerException
        at java.awt.Container.addImpl(Container.java:1090)
        at java.awt.Container.add(Container.java:410)
        at person.guifirst.<init>(guifirst.java:32)
        at person.person.main(person.java:6)
4

5 に答える 5

1

label1あなたの問題は、インスタンス化せずに追加しようとしています。

panel.add(label1);

オブジェクト型の変数は Java では常に参照であるため、その呼び出しを行う前に label1 をインスタンス化しても、ActionListener はフレーム内のラベルを置き換えません。古いラベルをコンテナに残しながら、参照を別のものに変更するだけです。

代わりに、ラベルをインスタンス化してコンポーネントに追加する必要があります。次に、ActionListener で、setText(String)メソッドを使用してラベルの表示内容を変更します。

于 2013-08-23T18:56:36.310 に答える
1

ドキュメントからContainer#add

例外: NullPointerException - comp が null の場合

次の行が原因のようです

panel.add(label1);

actionPerformedでを呼び出すまでその変数をインスタンス化しないためActionListener、それはまだnullに追加しようとしているときですpanel

于 2013-08-23T18:56:38.500 に答える
1

初期化していないlabel1ため、この行は失敗します

panel.add(label1);

UI が生成されてボタンがクリックされるまで呼び出されないメソッドで初期化しようとしています。

    class addaction implements ActionListener{
        public void actionPerformed(ActionEvent event){
            double number=Double.parseDouble(text.getText());
            double result=number*number;
            label1=new JLabel("Your result is"+result);
        }
    }

アクションが実行されるまでそのコードは実行されないため、これは機能しません。に追加する前に、Component(ラベル)を非にする必要があります。nullJPanel

最初に、デフォルト値に初期化する必要があります。

于 2013-08-23T18:56:22.857 に答える