1

私はJavaにかなり慣れていないので、「java.lang.NullPointerException」を取得しています

両方のテキストフィールドが null として返され、.setText() を使用してテキストフィールドに表示される理由がわからない

基本的に私がやろうとしているのは、値をvelocityTextViewに渡し、それをreturnTextViewに渡すことです。

このコードをメソッドreturnTextView.setText(velocityTextView.getText()); に入れてみました。actionPerformed()

私は立ち往生しており、いくつかのガイダンスが欲しいです。

import java.awt.Color;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class kinematica implements ActionListener {

    public JPanel totalGui;
    public JLabel progTitle;
    public JButton enterBtn;
    public JTextField velocityTextField, returnTextField;


    public static void main(String[] args) {

        showGui();

    }

    public JPanel createContentPane() {

        //  GUI panel to contain the elements that make GUI
        JPanel totalGui = new JPanel();
        totalGui.setLayout(null);


        // Title Label 
        JLabel progTitle = new JLabel("Linear Motion 1D");
        progTitle.setLocation(10, 10);
        progTitle.setSize(500, 30);
        progTitle.setHorizontalAlignment(JLabel.LEFT);
        totalGui.add(progTitle);



        // Buttons
        JButton enterBtn = new JButton("Enter");
        enterBtn.setLocation(100, 200);
        enterBtn.setSize(100, 50);
        enterBtn.addActionListener(this);
        totalGui.add(enterBtn);


        // text fields
        JTextField velocityTextField = new JTextField(20);
        velocityTextField.setLocation(100, 50);
        velocityTextField.setSize(80, 30);
        velocityTextField.setText("Velocity =");
        totalGui.add(velocityTextField);

        JTextField returnTextField = new JTextField();
        returnTextField.setLocation(100, 100);
        returnTextField.setSize(80, 30);
        returnTextField.setText("test1");
        totalGui.add(returnTextField);


        totalGui.setOpaque(true);
        return totalGui;

    }


    public void actionPerformed(ActionEvent e) {

        returnTextField.getText();

        System.out.println(velocityTextField);

    }

    public static void showGui() {

        JFrame window = new JFrame("Kinematica");
        kinematica demoWindow = new kinematica();
        window.setContentPane(demoWindow.createContentPane());

        window.setSize(1500, 1000);
        window.setVisible(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

}
4

3 に答える 3

4

関数からすべてのクラス名を削除しcreateContentPaneます。

あなたが言うとき、あなたは関数にローカル変数をJLabel progTitle作成しているので、メンバー変数について話しているわけではありません。これにより、MadProgrammer のおかげでVariable Shadowingの状況が発生し、問題が発生します。

したがって、後でメンバー変数にアクセスするとき、それは変更されないため、null.

変化する

JTextField returnTextField = new JTextField();

returnTextField = new JTextField();

これとその関数の同様の行で。

于 2013-08-11T04:02:33.510 に答える
2

問題は、変数をシャドウイングしていることです。2 つの `JTextField' をインスタンス フィールドとして宣言します。

public JTextField velocityTextField, returnTextField;

public JPanel createContentPane() {
    /*...*/

    // text fields
    JTextField velocityTextField = new JTextField(20);
    /*...*/

    JTextField returnTextField = new JTextField();

次に、createContentPaneメソッドでそれらを再宣言します

代わりに、ローカル宣言を削除します。たとえば...

public JTextField velocityTextField, returnTextField;

public JPanel createContentPane() {
    /*...*/

    // text fields
    velocityTextField = new JTextField(20);
    /*...*/

    returnTextField = new JTextField();
于 2013-08-11T04:06:06.937 に答える
0

カーシックが言ったように:

からクラス名を削除しcreateContentPaneます。これは次のようになります。

public JPanel createContentPane() {

    //  GUI panel to contain the elements that make GUI
    totalGui = new JPanel();
    totalGui.setLayout(null);


    // Title Label 
    progTitle = new JLabel("Linear Motion 1D");
    progTitle.setLocation(10, 10);
    progTitle.setSize(500, 30);
    progTitle.setHorizontalAlignment(JLabel.LEFT);
    totalGui.add(progTitle);



    // Buttons
    enterBtn = new JButton("Enter");
    enterBtn.setLocation(100, 200);
    enterBtn.setSize(100, 50);
    enterBtn.addActionListener(this);
    totalGui.add(enterBtn);


    // text fields
    velocityTextField = new JTextField(20);
    velocityTextField.setLocation(100, 50);
    velocityTextField.setSize(80, 30);
    velocityTextField.setText("Velocity =");
    totalGui.add(velocityTextField);

    returnTextField = new JTextField();
    returnTextField.setLocation(100, 100);
    returnTextField.setSize(80, 30);
    returnTextField.setText("test1");
    totalGui.add(returnTextField);


    totalGui.setOpaque(true);
    return totalGui;

}

なぜこれを行うのですか?メソッドの変数名の前にクラス名を置くと、LOCAL変数を宣言しているためです。代わりに、宣言したパブリック フィールドを使用します。この問題が再び発生するのを避けるために、インスタンス変数にはアンダースコアを使用し、ローカル変数にはアンダースコアを使用しないことをお勧めします。したがって、将来的に自分自身をチェックする_enterBtn代わりに使用できます。enterBtn

于 2013-08-11T04:08:10.797 に答える