Это приложение имеет строку меню с некоторыми пунктами меню, изображение компаса (compass.png), установленное в ImageView, ползунок для установки скорости вращения и метку для отображения текущего угла поворота.
В фоновом режиме у меня есть «поток вычислений», который принимает значение ползунков, вычисляет новый заголовок, обновляет значение метки и позволяет изображению вращаться.
Пока это работает нормально, но в результате через пару секунд вы больше не можете использовать строку меню/элементы. Кажется, что все кнопки меню или подменю полностью заморожены.
Основываясь на комментировании некоторых строк, я уверен, что команда imageView.setRotate() вызывает проблему.
Вот мой код (основанный на уменьшенном, минимальном, но воспроизводимом примере):
My Main.java:
Код: Выделить всё
public class Main {
static void main(String[] args) {
GUI.launch(GUI.class, args);
}
}
Код: Выделить всё
public class GUI extends Application {
public static double HEADING = 0.0;
private Thread calculationThread;
public static Scene scene;
@Override
public void init() {
calculationThread = new Thread(new CalculationThread());
calculationThread.setDaemon(true);
}
@Override
public void start(Stage primaryStage) {
VBox mainWindow = CompassWindow.createCompassWindow();
calculationThread.start();
scene = new Scene(mainWindow, 620, 780);
primaryStage.setScene(scene);
primaryStage.show();
}
}
Код: Выделить всё
public class CalculationThread implements Runnable {
private static final long UPDATE_RATE_COMPASS = 50; // in [ms]
@Override
public void run() {
while (true) {
try {
double step = (sliderSimulator.getValue() / 10) / (1000.0 / UPDATE_RATE_COMPASS);
HEADING = HEADING + step;
if (HEADING >= 360.0) HEADING = HEADING - 360.0;
if (HEADING < 0.0) HEADING = HEADING + 360.0;
Platform.runLater(() -> labelHeadingValue.setText(String.valueOf(HEADING)));
Platform.runLater(() -> {
//ATTENTION: If this line is commented in, the problem occurs!
if (imageCompass != null) imageCompass.setRotate(-HEADING);
});
Thread.sleep(UPDATE_RATE_COMPASS);
} catch (Exception e) {
System.err.println(e);
}
}
}
}
Код: Выделить всё
public class CompassWindow {
private static GridPane gridPaneBottomMenue;
private static VBox vBoxSimulator;
public static ImageView imageCompass;
public static Slider sliderSimulator;
public static Label labelHeadingValue;
public static VBox createCompassWindow() {
MenuBar menuBar = new MenuBar();
Menu menuFile = new Menu("File");
Menu menueHelp = new Menu("Help");
MenuItem itemClose = new MenuItem("Close");
itemClose.setOnAction((e) -> System.exit(0));
MenuItem itemInfo = new MenuItem("Info");
menuFile.getItems().addAll(itemClose);
menueHelp.getItems().addAll(itemInfo);
menuBar.getMenus().addAll(menuFile, menueHelp);
imageCompass = new ImageView(new Image("compass.png", 600, 600, false, false));
imageCompass.setTranslateX(50);
gridPaneBottomMenue = new GridPane();
labelHeadingValue = new Label("---");
gridPaneBottomMenue.add(labelHeadingValue,2,0);
sliderSimulator = new Slider(-20, 20, 0);
sliderSimulator.setSnapToTicks(true);
sliderSimulator.setBlockIncrement(1);
sliderSimulator.setMajorTickUnit(1);
sliderSimulator.setMinorTickCount(0);
sliderSimulator.valueProperty().addListener((obs, oldval, newVal) -> sliderSimulator.setValue(newVal.intValue()));
vBoxSimulator = new VBox(10, sliderSimulator);
gridPaneBottomMenue.add(vBoxSimulator,1,0);
GridPane gridPaneGlobal = new GridPane();
gridPaneGlobal.add(imageCompass, 0, 0);
gridPaneGlobal.add(gridPaneBottomMenue, 0, 1);
return new VBox(menuBar, gridPaneGlobal);
}
}
Код: Выделить всё
4.0.0
org.example
ImageViewExample
1.0-SNAPSHOT
25
${java.version}
${java.version}
UTF-8
org.openjfx
javafx-controls
25.0.2
javafx
src/main/resources
true
src/main/config
${project.build.directory}
true
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
${java.version}
${java.version}
org.openjfx
javafx-maven-plugin
0.0.8
org.example.Main
org.apache.maven.plugins
maven-shade-plugin
3.6.1
false
${project.artifactId}
package
shade
org.apache.maven.plugins
maven-jar-plugin
3.5.0
true
lib/
org.example.Main
Может ли кто-нибудь дать мне подсказку, почему строка меню/элементы зависают и как этого избежать? Может быть, есть другая возможность прослушать изменение ползунка и позволить ImageView вращаться?
Подробнее здесь: https://stackoverflow.com/questions/798 ... bar-freeze
Мобильная версия