Я создаю программу javafx, и мое меню навигации для программы работает, изменяя корень сцены. Корни все наследуются от класса Pane. Некоторые из панелей имеют фоновые потоки, которые они запускают. Но когда корневая панель изменяется обработчиками событий, панель переключается, но фоновые потоки не останавливаются. Это вызывает проблемы, когда потоки читают NFC и приводит к тому, что несколько потоков пытаются читать из NFC-считывателя.
Как закрыть фоновый поток? (извне панели, где они созданы), или мне нужно настроить потоки другим способом. (Потоки настроены на Daemon). Нити создаются в конструкторе панели как показано ниже: (Я предположил, что, поскольку они принадлежали панели, когда панель переключается, поток останавливается. Это не так).Фон Темы, которые не закрываются при изменении корневого узла [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, новый ДомМатериалы (primaryStage));
Scene homeScene = new Scene (myPane);
primaryStage.setMinHeight(1000);
primaryStage.setMinWidth(1700);
primaryStage.setScene(homeScene);
primaryStage.show();
Демон-потоки выходят, когда jvm выходит или возвращается. Если вы хотите выйти раньше, вам нужно закрыть их вручную. Стандартный способ выполнения этого заключается в том, чтобы регулярные обратные потоки проверяли флаг «keepGoing», который вы можете отключить, когда хотите, чтобы они выходили. –
Нити, являющиеся потоками деамонов, не имеют никакого эффекта, за исключением того, что они не предотвращают выключение среды выполнения. Вам нужно реализовать некоторую логику для того, чтобы закрыть эти потоки самостоятельно ... Вероятно, вы могли бы использовать некоторый «AtomicReference», обновленный от слушателя, до корня «Scene», который позволяет 'Thread' проверять, если корень сцены все еще «свой» корень и заканчивается иначе, но сложно что-либо рекомендовать, поскольку объем информации о вашем дизайне мал ... Использование служб-исполнителей может помочь btw ... – fabian
Если вы не покажете, как создаются потоки и закрыты в вашем коде, мы не можем сказать, нужно ли настраивать потоки иначе или нет! Предоставьте несколько [Минимальный, Полный и Подтверждаемый код] (http://stackoverflow.com/help/mcve), который воссоздает вашу ситуацию. –