2

だから私の質問はとても簡単です。ではなくの場合、別のクラスのクラス メンバーにアクセスできますが、 の場合はアクセスできないようです。JDK 7u6 (JavaFX 2.2 を使用) を使用します。StringLabel Label

簡単な例。最初のものは機能しますが、2 つ目は機能しません。 foo.label最初の例では割り当てることができますが、2 番目の例では NullPointer を取得します。foo.label以下の 2 番目の例で null の理由を説明できる人はいますか?

更新: 元の質問から @FXML 注釈を削除しました。これは、私が抱えていた問題にそれらが必要だとは思わなかったためです。また、 @jewelsea による回答に対する私のコメントを参照してください。最後に、完全を期すために FXML ファイルを追加しました (Q の下部)。

これは機能します:

// Example 1:
public class SampleController implements Initializable {
    Foo foo = new Foo();

    public void handleButtonAction(ActionEvent event) {
        System.out.println("You clicked me!");
        foo.label = "Hello World!";
        System.out.println(foo.label);
    }

    @Override public void initialize(URL url, ResourceBundle rb) {
    }    
}

// Example 1 -- Foo.java:
public class Foo {
    public String label;
}

そして、これは機能しません:

// Example 2:
public class SampleController implements Initializable {
    Foo foo = new Foo();

    public void handleButtonAction(ActionEvent event) {
        System.out.println("You clicked me!");
        foo.label.setText("Hello World!");  // gives NullPointer exception !!
    }

    @Override public void initialize(URL url, ResourceBundle rb) {
    }    
}

// Example 2 -- Foo.java:
import javafx.scene.control.Label;

public class Foo {
    public Label label;
}

上記の例のいずれかの FXML ファイルを次に示します。

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml" fx:controller="javafxapplication4.SampleController">
    <children>
        <Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" />
        <Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" text="hey!" />
    </children>
</AnchorPane>
4

2 に答える 2

3

2番目の例では、fooラベルを何にも初期化していないため、nullのままになります。

を使用してFooオブジェクトを作成しますが、FooFoo foo = new Foo();内のラベルフィールドメンバーを初期化することはできません。特に、@ FXMLアノテーションは、提供されたコードで使用した方法では何もしません。これは、Fooがコントローラーではないためです。

サンプルを実行できるようにするいくつかの方法:

1.Fooを取り除く

  • あなたのに移動@FXML public Label label;しますSampleController
  • Fooクラスを削除し、fxmlがを定義していることを確認しますfx:id="label"

2.SampleControllerでFooラベルを初期化します

  • サンプルコントローラーのinitializeメソッドに次のコードを配置しますfoo.label = new Label();
  • また、初期化時に、fooラベルをレイアウトペインなどのコンテナに追加して、表示されるようにします。

3.Fooをネストされたコントローラーにする

  • Fooクラスを維持します。
  • @FXML Foo foo;の代わりにを使用して、コントローラでFooインスタンスを初期化しますFoo foo = new Foo();
  • Fooクラスをコントローラーにします(Initializableを実装するか、適切な署名を使用して初期化メソッドを定義します)。
  • を参照するfxmlには、Fooインスタンスの初期化を許可するように設定する新しいfoo.xmlドキュメントSampleControllerのステートメントもあります。fx:includefx:id="label"

3番目の方法は、必要なものに最も近いように思われ、そのドキュメントは、FXMLの概要ドキュメントの「ネストされたコントローラー」セクションにあります。

注:この質問は、@ FXMLを使用してクラスのメンバーを初期化する方法、およびクラスのメンバーにアクセスする方法に関するものです。アクセスは、例ですでに行っているように、通常のゲッター/セッターまたはメンバーフィールドアクセスを介して行われます。

最初の例は、foo.labelをfoo.label = "Hello World!";使用する前に(を使用して)新しい文字列に明示的に初期化しているため、機能します。

于 2012-09-18T00:45:25.773 に答える
1

男、あなたはすべてを混ぜました!しかし、それは起こります。

まず、例 1 では:

public String label;

ラベルではなく文字列です。また、FXML ファイルで文字列を使用していないことは確かです (使用できないわけではありませんが、ステージに表示されないだけです)。

とにかく、「=」記号を使用すると文字列が初期化されます。@FXML を Initializable インターフェイスを実装しないクラスに配置する、FXML ファイルから何も初期化されません (ちなみに、これはコントローラーとして初期化可能)、したがって、null オブジェクトを参照しています。

例 2 の問題を解決するには、次のことを行う必要があります。

// 例 2:

import javafx.fxml.FXML;
import javafx.scene.control.Label;

public class SampleController implements Initializable {
    @FXML public Label label;

    @FXML private void handleButtonAction(ActionEvent event) {
        System.out.println("You clicked me!");
        foo.label.setText("Hello World!");  // gives NullPointer exception !!
    }

    @Override public void initialize(URL url, ResourceBundle rb) {
    }    
}

次のような FXML ファイルがあることを確認します。

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.control.Button?>

<AnchorPane xmlns:fx="http://javafx.com/fxml" fx:id="whatever-id" fx:controller="samplecontroller.package.SampleController">
   <children>
      <Label fx:id="label" text="not really necessary" />
      <Button fx:id"btnLabelChanger" onmouseclick="#handleButtonAction"/>
   </children>
</AnchorPane>

お役に立てば幸いです。乾杯。

于 2012-09-18T00:55:22.327 に答える