私はjavafxプログラムを作成しています。プログラムのナビゲーションメニューは、シーンのルートを変更することで機能します。ルーツはすべてPaneクラスから継承しています。ペインのいくつかは、実行するバックグラウンドスレッドを持っています。しかし、イベントハンドラによってルートペインが変更されると、ペインは切り替わりますが、バックグラウンドスレッドは停止しません。これは、スレッドがNFCを読み取り、複数のスレッドがNFCリーダーからの読み取りを試みるため、問題を引き起こします。
バックグラウンドスレッドを閉じるにはどうしたらいいですか? (作成されたペインの外側から)、または別の方法でスレッドを設定する必要がありますか。 (スレッドはデーモンに設定されています)。 スレッドは、次のようにPaneコンストラクタで作成されます: (私は、ウィンドウが切り替わったときにウィンドウに属していたと仮定していましたが、スレッドは停止します。背景ルートノードが変更されたときにスレッドが閉じない[javaFX]
Runnable r = new Runnable() {
@Override
public void run() {
boolean cont = true;
while(cont){
try {
NFCcard create1 = new NFCcard();
String staffID=create1.getCardID().toString();
staffID = staffID.replaceAll("\\D+","");
signIn.setText("Welcome "+getUserName(staffID)+getPhotoSrc(create1.getCardID().toString()));
Thread.sleep(1000);
} catch (CardException e) {
} catch (InterruptedException e) {
}
signIn.setText("Scan your card to sign in/out");
if(getScene().getRoot().isDisable());
cont=false;
}
}};
Thread nfcCheckThread = new Thread(r);
nfcCheckThread.setDaemon(true);
nfcCheckThread.start();
私はこのような静的な方法でペインを切り替えます(この方法が自分のクラスの中にあります)。
public static void homeButtonhandler(Stage stage){
HomePane mainPane1=new HomePane(stage, new HomeContent(stage));
stage.getScene().setRoot(mainPane1);
}
public static void adminButtonhandler(Stage stage){
DialogBox dialog = new DialogBox();
try{
Optional<String> result = dialog.showAndWait();
if (result.get().equals("115")){
AdminPane adminPane1 = new AdminPane(stage,new Content(stage));
stage.getScene().setRoot(adminPane1);
}}
catch(NoSuchElementException Exception){
}
}
public static void workingTodayButtonhandler(Stage stage){
//TODO trying to make the content change when when buttons are clicked
HomePane mainPane2=new HomePane(stage,new WorkingTodayContent(stage));
stage.getScene().setRoot(mainPane2);
// System.out.println(mainPane2.content);
}
まず、呼び出しは次のとおりです。
HomePane myPane =新しいHomePane(primaryStage、新しいHomeContent(primaryStage));
Scene homeScene = new Scene (myPane);
primaryStage.setMinHeight(1000);
primaryStage.setMinWidth(1700);
primaryStage.setScene(homeScene);
primaryStage.show();
デーモンスレッドは、jvmが終了するかメインが戻るときに終了します。早期に終了したい場合は、手動で終了する必要があります。これを行う標準的な方法は、backroundスレッドに定期的に "keepGoing"フラグをチェックさせることです。このフラグは、終了させるときに解除することができます。 –
デーモンスレッドであるスレッドは、ランタイムのシャットダウンを防止しない限り、何の効果もありません。これらのスレッドを自分でシャットダウンするためのロジックを実装する必要があります...リスナーから 'Thread'を確認できる' Scene'ルートに更新された 'AtomicReference'を使うことができます。シーンのルートがあなたのデザインに関する情報の量が少ないので、何かをお勧めするのは難しいです... Executorサービスを使用すると、btwを助けることができます。 – fabian
スレッドの作成方法が表示されない場合はあなたのコードで閉じている場合、別の方法でスレッドを設定する必要があるかどうかは言えません。あなたの状況を再現するいくつかの[最小、完全、および検証可能なコード](http://stackoverflow.com/help/mcve)を提供してください。 –