0

私はチャットクライアント/サーバーに取り組んでいます。クライアントには、 と呼ばれるクラスと、を拡張ClientGuiする と呼ばれるサブクラスがあります。GUI関連のクライアントの主要部分を処理しますが、ユーザーからの入力のみを処理します。InputPaneJPanelClientGuiInputPane

クラスのオブジェクトにNullPointerExceptionフォントを設定しようとすると、おかしくなり続けます。これが私のコードの一部です:InputPaneClientGui

public ClientGui() {
    // configure JFrame

    this.serverOutput = new JTextPane();
    this.input = new InputPane();

    // configure JScrollPane

    // configure other objects

    // various set up methods

    frame.add(scrollPane, BorderLayout.CENTER);
    frame.add(input, BorderLayout.PAGE_END);
}

ご覧のとおり、inputオブジェクトは初期化されています。そのコンストラクタは次のとおりです。

public InputPane() {
        this.inputField = new JTextField();
        this.send = new JButton("Send");

        // set size

        this.setFont(getFont());

        // various methods

        // add components
    }

フォントを設定しようとすると、NullPointerException. いろいろ電話をかけた結果、andが nullprintln()であることを知ることができました。コンストラクターにメソッドを入れようとしましたが、呼び出された (および/または出力された) ものはありませんでした。inputFieldsendprintln()

私はこれに非常に混乱しています。誰かが説明を与えることができれば、それは大いに役立つでしょう。ありがとうございました。

編集:これがStackTraceです:

Exception in thread "main" java.lang.NullPointerException
at net.dean.tcp.client.gui.ClientGui$InputPane.setFont(ClientGui.java:518)
at javax.swing.LookAndFeel.installColorsAndFont(Unknown Source)
at javax.swing.plaf.basic.BasicPanelUI.installDefaults(Unknown Source)
at javax.swing.plaf.basic.BasicPanelUI.installUI(Unknown Source)
at javax.swing.JComponent.setUI(Unknown Source)
at javax.swing.JPanel.setUI(Unknown Source)
at javax.swing.JPanel.updateUI(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at net.dean.tcp.client.gui.ClientGui$InputPane.<init>(ClientGui.java:496)
at net.dean.tcp.client.gui.ClientGui.<init>(ClientGui.java:138)
at net.dean.tcp.client.gui.ClientGui.main(ClientGui.java:44)

EDIT 2ClientGui$InputPane.setFont(Font)方法は次のとおりです。

public void setFont(Font f) {
        super.setFont(f);
        inputField.setFont(f);
        send.setFont(f);

        Dimension size = getSizeFromFont(); 
        // Dimension based on getFont()'s height

        send.setPreferredSize(size);
        inputField.setPreferredSize(size);
    }
4

2 に答える 2

4

問題は、SwingフレームワークがコンストラクターsetFontの一部として呼び出すことです。JPanelこれはコンストラクターの本体の前に実行されるため、およびメンバー変数が初期化InputPane.setFontされる前に呼び出されます。ここでの唯一のクリーンな解決策は、内部で明示的なnullチェックを実行することだと思います。sendinputFieldInputPane.setFont

public void setFont(Font f) {
    super.setFont(f);
    if (inputField != null) {
        inputField.setFont(f);
    }
    if (send != null) {
        send.setFont(f);
    }

    Dimension size = getSizeFromFont(); 
    // Dimension based on getFont()'s height

    if (send != null) {
        send.setPreferredSize(size);
    }
    if (inputField != null) {
        inputField.setPreferredSize(size);
    }
}

(おそらく、呼び出しを再編成して、ヌルチェックの数を減らすことができます。)

余談ですが、これは、コンストラクターからオーバーライド可能なメソッドを呼び出すことが悪い習慣である理由の良い例です。しかし、Swingはそれが何であるかであり、それについて泣き言を言うことには利益がないので、ここで停止します。:)

于 2012-10-18T05:06:35.093 に答える
0

を使用してフォントを設定し、メソッドsetFontからフォントを取得してgetFont設定する場合。これがgetFont()NULLを返す可能性が高く、それが理由である可能性があります。また、私の意見では、明示的にNULLにしない限りinputField、オブジェクトもsendオブジェクトもNULLにすることはできません。inputPane

于 2012-10-18T04:25:49.683 に答える