10

fxml と一緒に javafxを使用しているので、実際のコーディングにはコントローラーを使用します。x 軸または y 軸の位置を取得するなど、ステージでいくつかの操作を行う必要があります。stage.getX()&を試しstage.getYましたが、機能しません (エラーとしてステージ名が強調表示されます)。コントローラーでそのような関数を使用するにはどうすればよいですか? メインファイルでこれを試しました:

 public int locationX = stage.getX();


public double locationX = stage.getX();

しかし、それは機能せず、代わりにプログラム全体を 1 つの大きなエラーにします。
では、コントローラ ファイルでそのような機能を実行するにはどうすればよいでしょうか。何かをインポートするか、上記のようなことを別の方法で行う必要がありますか?

error: cannot find symbol
    locationX = stage.getX();
symbol:   variable stage
location: class FXMLController


「ステージ」が欠けていることを知っています。しかし、コントローラーで「ステージ」を取得するにはどうすればよいですか?

4

6 に答える 6

14

サンプル溶液

パラメータの受け渡し JavaFX FXMLの手法を使用して、コントローラでステージを初期化できます。

ユーティリティ ウィンドウをドラッグすると、画面の x 座標と y 座標を追跡するユーティリティ ウィンドウを作成するサンプル プログラムを次に示します。ユーティリティ ウィンドウの内容は、fxml で定義されたペインに表示されます。

ステージコーデ

StageTrackingSample.java

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.*;
import javafx.stage.*;

public class StageTrackingSample extends Application {

  @Override public void start(final Stage stage) throws Exception {
    final FXMLLoader loader = new FXMLLoader(
      getClass().getResource(
        "stagetracking.fxml"
      )
    );

    final Parent root = (Parent) loader.load();
    final StageTrackingController controller = loader.getController();
    controller.initData(stage);

    stage.initStyle(StageStyle.UTILITY);
    stage.setResizable(false);
    stage.setScene(new Scene(root));
    stage.show();
  }

  public static void main(String[] args) { launch(args); }
}

StageTrackingController.java

import javafx.beans.binding.Bindings;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.stage.Stage;

public class StageTrackingController {
  @FXML private Label stageX;
  public void initialize() {}  
  public void initData(final Stage stage) {
    stageX.textProperty().bind(
      Bindings.format(
        "(%1$.2f, %2$.2f)", 
        stage.xProperty(), 
        stage.yProperty()
      )
    );
  }
}

stagetracking.fxml

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

<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="30" minWidth="100" xmlns:fx="http://javafx.com/fxml" fx:controller="test.StageTrackingController">
  <Label fx:id="stageX" layoutX="0" layoutY="0"/>
</AnchorPane>

代替ソリューション

@FXML コンポーネントからステージを取得するという tarrsalah の回答も、コントローラーのルート コンポーネントが既にステージに追加されているシーンに既に追加されていることがわかっている場合に適した方法です (これは、何かの場合によくあるケースです)。ボタンイベントハンドラーが起動されるように)。

それを行う別の方法は、tarrsalah の回答に似ていますが、@FXML ノードのシーン プロパティと変更されたシーンのウィンドウ プロパティで ChangeListeners を使用します。これにより、ペインが新しいシーンまたはステージに移動した場合に、シーンおよびステージへの変更を追跡できます。ほとんどのペインは 1 つのステージに留まる単一のシーンに追加されるだけなので、ほとんどの場合、これらの変更を追跡する必要はありません。

追加の質問とコメントへの回答

もっと簡単な答えを得ることができますか?

tarrsalah はすでにより簡単な回答を提供しています。

この場合のより単純な回答の唯一の問題は、回答のソリューションを複製して作業に適応させるために必要な十分なコンテキストが提供されない可能性があることです。

私は現在の答えをできる限りシンプルにしましたが、残念なことに、最も基本的な JavaFX FXML アプリケーションでさえ、かなりのコードとマークアップが必要です。

私はJavaの初心者です

最初の Java および JavaFX アプリケーションの開発を初めて開始する場合は、FXML を使用しないでください。代わりに、JavaFX コードでは標準のJava APIをそのまま使用してください。この API については、参照すべき 優れたEnsemble サンプルだけでなく、さらに多くのチュートリアルがあります。

JavaFX を開始する前に、基本をカバーする Java チュートリアル トレイルをすべて完了していることを確認してください。JavaFX の使用を開始するには、Java の基本のみが必要です。Java Enterprise Edition の学習に分岐する必要はなく、Swing を忘れることができます。

いくつかの基本的な JavaFX アプリケーションを作成し、Java API に従っていくつかのレイアウトを手作業でコーディングし、コア技術に慣れてきたら、大規模なアプリケーションにSceneBuilderと FXML を使用することを検討してください。その時点で、FXML の学習は非常に簡単であることがわかるでしょう。FXML の属性と要素は、Java API を反映したものにすぎません。

コードの通常とは異なるビットについて説明してください

あなたにとって何が異常なのかわからないので、私は本当にそれをすることはできません.

自分の知識や調査では理解できないコードの特定の部分がある場合は、難しい概念ごとに新しい StackOverflow の質問を作成してください。

于 2013-05-20T17:47:21.523 に答える
3

まあ、それに対する最も簡単な答えは...

Main クラスで、Controller クラスのインスタンス (オブジェクト) を作成します。



    FXMLLoader loader = new FXMLLoader(getClass().getResource("Example.fxml"));
    MyController controller = loader.getController();
    controller.setStage(this.stage);

Controller クラスには、「抽出」のメソッド (セッター) を配置する必要があります。



    private Stage primaryStage;

    public void setStage(Stage stage) {
         this.primaryStage = stage;
    }

そして、フルスクリーンボタンを追加できます;)



    @FXML
    private Button btnFullScreen = new Button();

    public void setFullscreen(ActionEvent event){       
         if(primaryStage.isFullScreen()){
              primaryStage.setFullScreen(false);
         } else {
              primaryStage.setFullScreen(true);
         }
    }

于 2014-04-09T03:37:05.280 に答える
1

このスレッドは古いですが、まったく偶然に関連するものを発見しました。私が考えたのは、動作するはずのないコーディング エラーでしたが、動作しました。コントローラー クラスでは、次のメンバー変数を宣言するだけです。

@FXML プライベート ステージ ステージ。

fxml ドキュメントのウィジェットにアクセスできるように、コントローラーのステージにアクセスできました。これが事実であるというドキュメントは見つかりませんでしたが、私が JavaFX に慣れていないことは認めます (ただし、Swing には慣れています)。しかし、うまくいくようです。期待するのは危険かも?

于 2015-09-16T22:21:51.120 に答える
1

Main や Events ではなく*.FXML ファイルと Controller を使用する場合は、次のようにします。

@FXML private Stage stage;
stage = (Stage) elemen.getScene().getWindow();

要素は、FXML の任意のコントロールまたは要素にすることができます。私の場合は AnchorPane です。

@FXML  private AnchorPane element;
于 2016-03-07T16:58:57.817 に答える
0

最善の方法は、新しいコントローラーを作成しstage、コンストラクターを介して を渡すことです ( fx:controllerFXML ファイルでは使用しないでください)。それ以外の場合は、 が呼び出さstageれるnullときになりinitialize()ます (その時点で、 が呼び出されるload()initialize()、 nostageが に付加されるsceneため、は) ですscenestagenull

public class AppEntryPoint extends Application
{
    private FXMLLoader loader;

    @Override
    public void init() throws Exception
    {
        loader = new FXMLLoader(getClass().getResource("path-to-fxml-file"));
    }

    @Override
    public void start(Stage initStage) throws Exception
    {
        MyController controller = new MyController(initStage);
        loader.setController(controller);
        Scene scene = loader.load();
        initStage.setScene(scene);
        initStage.show();
    }

    public static void main(String[] args)
    {
        launch(args);
    }
}
public class MyController
{
    private Stage stage;

    @FXML private URL location;
    @FXML private ResourceBundle resources;

    public MyController(Stage stage)
    {
        this.stage = stage;
    }

    @FXML
    private void initialize()
    {
        // You have access to the stage right here
    }
}
于 2016-06-27T06:29:04.970 に答える