2

私のアプリでは、いくつかのフィールドとボタンで構成されるポップアップ ダイアログを持つ 1 つのシーンがあります。ボタンをクリックすると、ポップアップ ダイアログを閉じて、シーン内のいくつかのフィールドを更新したいと考えています。間接的にシーンをリフレッシュしたい。出来ますか?

次のコードを使用しました。ここでは、そのシーンのコントローラーを取得し、id を使用してフィールドを更新します。しかし、うまくいきません。

 URL location = AdmincontrolController.class.getResource("admincontrol.fxml");

 FXMLLoader fxmlLoader = new FXMLLoader();
 fxmlLoader.setLocation(location);
 fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
 try {
     Parent root = (Parent) fxmlLoader.load(location.openStream());
     AdmincontrolController controller = fxmlLoader.getController();
     System.out.println("AdmincontrolController: "+controller);
     controller.setEmail(item.getEmail());
 } catch (IOException ex) {
     Logger.getLogger(Add_loginController.class.getName()).log(Level.SEVERE, null, ex);
 }

シナリオ:

シーン ここに画像の説明を入力

ポップアップ- 追加をクリックした場合は、そのダイアログを閉じて、前のシーンの電子メール テキストを変更する必要があります。 ここに画像の説明を入力

4

4 に答える 4

1

アレクサンダーが上で述べたように、電子メールを表示するために使用しているオブジェクトの基になるテキスト プロパティを更新するだけでうまくいくはずです。プロパティを操作していることを確認する必要があります (詳細については、Oracle Java FX プロパティ チュートリアルを参照してください)。具体例として:

FXML

 <Text fx:id="email" />
 <TextField fx:id="emailInput" />
 <Button onAction="#doSetEmail" text="Set Email"/>

コントローラーで、@FXML アノテーションを使用してオブジェクトの具体的なインスタンスを挿入し、ハンドラーを設定してテキストを調整します。

コントローラ

@FXML
Text email;

@FXML
TextField emailInput;

@FXML
public void doSetEmail(ActionEvent ae) {
    email.setText(emailInput.getText());
}

または、メール テキスト プロパティをメール ラベル プロパティにバインドして、変更が自動的に反映されるようにすることもできます。

email.textProperty().bind(emailInput.textProperty());

コントローラーinitialize()メソッドでこれを行うことができます。

さて、このすべての作業に対する警告は、イベントをどのように処理しているか、およびこれで何をしているかによって異なります。最初の回答で要求されたコードをまだ投稿していないため、問題が発生している可能性があります。つまり、スレッドを開始してからワーカースレッドから JavaFX スレッドの UI 要素を更新しようとすると、(潜在的に) 更新されないという問題が発生する可能性があります。これは、オブジェクトの構造に大きく依存しており、意味のある方法でコメントするのに十分な情報を提供していません。

  • チョーク
于 2013-11-01T13:31:04.680 に答える
1

シーンを手動で更新したいという気持ちになるたびに、おそらく backgroundWorker Thread を使用して作業を行う必要があります。このようにして、UI スレッドは時間を使用してラベルなどを更新できます。

于 2017-07-04T11:39:56.220 に答える
0

シーンを更新するには、閉じないとできません...しかし、コントロールのクラスレベル宣言を行うことができれば..つまり、それらを静的にすることができます...

これを試して..

メインファイルに関数を作成します。

MainPanel.java

public static void SetMail(String email)
{
txtmail.setText(email);
}

LoginPanel.java

 btnclear.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent t) {                      
            MainPanel.SetMail(txtEmail.getText());


    }          
    });
于 2013-11-01T09:45:48.833 に答える