0

そこで、簡単な「エリアファインダー」プログラムを作ってみました。テキストベースで動作しますが、GUI を追加するとエラーが発生し、何が原因なのかわかりません。私のつづりが間違っていたらごめんなさい。私はつづりが上手ではありません。

コード

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class AF implements ActionListener {

    double length;
    double width;
    double answer;

    JTextField twidth = null;
    JTextField tlength = null;

    void AFWindow() {

        JFrame AFwindow = new JFrame();
        JPanel pan2 = new JPanel(new GridBagLayout());
        AFwindow.setVisible(true);
        AFwindow.setSize(250, 150);
        AFwindow.setResizable(false);
        GridBagConstraints c = new GridBagConstraints();
        AFwindow.add(pan2);
        pan2.setBackground(Color.LIGHT_GRAY);

        c.gridx = 0;
        c.gridy = 5;
        JTextField tlength = new JTextField();
        tlength.setText("    Length    ");
        pan2.add(tlength, c);

        c.gridx = 0;
        c.gridy = 0;
        JTextField twidth = new JTextField();
        twidth.setText("     Width     ");
        pan2.add(twidth, c);

        JButton Find = new JButton("Ok");

        c.gridx = 0;
        c.gridy = -5;
        pan2.add(Find);
        Find.addActionListener(this);
        Find.setActionCommand("ok");
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equalsIgnoreCase("ok")) {
            try {
                this.length = Double.parseDouble(tlength.getText());
                this.width = Double.parseDouble(twidth.getText());

            } catch (NumberFormatException ex) {
                System.out.println("There was an issue!");
            }
        }
    }

    int area = (int) (length * width);

    public void answer() {
        JFrame answer = new JFrame();
        answer.setVisible(true);
        answer.setBackground(Color.yellow);
        JPanel pan2 = new JPanel();
        JLabel howanswer = new JLabel("Your answer is" + area
                + "We got this by multiplaying the length and width");
        pan2.add(howanswer);
    }
}

エラー

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at AF.actionPerformed(AF.java:53)
    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$000(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

2 に答える 2

2

クラスには、次のものがあります。

JTextField tlength = null;
JTextField twidth = null;

そして、コンストラクターには次のものがあります。

JTextField tlength = new JTextField();
tlength.setText("    Length    ");
pan2.add(tlength, c);
...
JTextField twidth = new JTextField();
twidth.setText("     Width     ");
pan2.add(twidth, c);

これらtlengthtwidth、宣言して JPanel に追加するものは、そのコンストラクターのみのスコープ内のローカル変数です。actionPerformedメソッドは代わりにクラスのインスタンス変数tlengthおよびを参照しtwidthていますが、これらはインスタンス化されていないため、まだ null です。したがって、 を呼び出そうとするとtlength.getText()、NullPointerException がスローされます。

修正するにJTextField tlength = new JTextField();は、コンストラクターの行を に変更しますtlength = new JTextField();。ラインについても同じことを行いJTextField twidth = ...ます。

于 2012-07-05T06:06:23.740 に答える
1

が のときにNullPointerException呼び出しているため、 を取得しています。で同じ問題が発生します。 tlength.getText()tlengthnulltwidth

この問題を解決するには、アクションが起動される前にこれらの変数をインスタンス化します。

具体的には、以下の変更を行います。

JTextField tlength = new JTextField();
JTextField twidth = new JTextField();
// Update the lines above to the following.
this.tlength = new JTextField();
this.twidth = new JTextField();

Roddy は、これらの特定の変更が関連する理由について、適切に説明しています。

于 2012-07-05T06:01:09.710 に答える