17

JavaFxフレームワークを使用しているため、グラフィック操作を実行する必要がある単純なコンソールアプリケーションがあります(テキストのcssスタイリングのように必要な機能がいくつかあります)。いくつかの形状とテキストを非表示のシーンに生成して保存しますファイルにあるもの、それだけです。

JavaFx を操作するには、グラフィックス操作を JavaFx スレッドに渡す必要があることを知っていますが、すべてが完了してアプリケーションを閉じる必要がある場合 (数時間後)、この JavaFx スレッドはまだ開いたままです...そして、私は本当にそうしませんSystem.exit() で強制的に終了したいのは、何かがブロックされている場合は知りたい/待ちたいからです (また、すべてを JavaFx アプリケーションとして実行したくない (JavaFx コンポーネントはメイン アプリケーションの 1% 未満であるため))

コードは非常にシンプルで、グーグルで検索するだけで使用できることがわかりました

Platform.exit();

うまくいかないようですが、次のようなプラットフォームパラメーターで遊んでみました

Platform.setImplicitExit(false);

ここにあなたが実行できる私のテストアプリケーションがあります:

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.geometry.Pos;
import javafx.scene.layout.VBox;

public class SOTestFX {
    public static void main(String[] args) {
        SOTestFX t = new SOTestFX();
        t.runFxThread();
    }

    public  void runFxThread(){
        //Application.launch(args);
        final JFXPanel jfxPanel = new JFXPanel(); 
        Platform.runLater(new Runnable() {
            @Override
            public void run() {

                System.err.println("CREATING IMAGE");
                simpleFXoperations();
                System.err.println("NOW CALL EXIT");
                System.err.println("JAVA FX THREAD SHOULD BE EXITED NOW");
                Platform.exit();
            }
        });

        try {
            Thread.sleep(3000); // just wait a bit if something should happen, let it happen..
        } catch (InterruptedException e) {
            e.printStackTrace();  
        }
        //jfxPanel.removeNotify(); // return ->  java.lang.NullPointerException
        //Platform.exit(); // -> does nothing

        System.err.println("i will never die!");
    }
    public void simpleFXoperations(){

        VBox vbox1 = new VBox();
        vbox1.setAlignment(Pos.BOTTOM_CENTER);
        vbox1.setStyle("-fx-border-style: solid;"
                + "-fx-border-width: 1;"
                + "-fx-border-color: white");
        System.err.println("simpleFXoperations() _DONE");
    }
}

そして、これは決して閉じることのないスレッドです

「アタッチ リスナー」 - スレッド t@17 java.lang.Thread.State: RUNNABLE

ロックされた所有可能なシンクロナイザー: - なし

「JavaFX アプリケーション スレッド」 - スレッド t@13 java.lang.Thread.State: RUNNABLE at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) at com.sun.glass.ui.gtk.GtkApplication$3 $1.run(GtkApplication.java:82) at java.lang.Thread.run(Thread.java:722)

ロックされた所有可能なシンクロナイザー: - なし

更新: Linux Fedora 16 64 ビットで最新の Oracle JDK 7u17 64 ビットを使用しています。

4

4 に答える 4

2

(私の理解では) JavaFX スレッドの目的は、さまざまなハードウェア パイプラインを透過的に利用することであるため、これは難しい状況です。JavaFX リクエストを別の参照プロジェクトに配置することをお勧めします。メインメソッドを含む他のすべてを別のメソッドに保持しますか? それはいつも私のために働いています。

基本的に、ビジネス ロジックとモデルは 1 つのプロジェクトに配置され、ビューとコントロール (通常は JavaFX ベース) は別のプロジェクトに配置されます。これにより、JavaFX スレッドの独立した終了が可能になります。うまくいけば、それはあなたがやろうとしていることに当てはまります。

于 2013-09-04T11:39:30.560 に答える