ImageView.setRotate позволяет заморозить строку менюJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 ImageView.setRotate позволяет заморозить строку меню

Сообщение Anonymous »

Я пишу приложение, которое имитирует и демонстрирует компас на основе JavaFX 25/Java 25 и Maven 3.9.12.
Это приложение имеет строку меню с некоторыми пунктами меню, изображение компаса (compass.png), установленное в ImageView, ползунок для установки скорости вращения и метку для отображения текущего угла поворота.
В фоновом режиме у меня есть «поток вычислений», который принимает значение ползунков, вычисляет новый заголовок, обновляет значение метки и позволяет изображению вращаться.
Пока это работает нормально, но в результате через пару секунд вы больше не можете использовать строку меню/элементы. Кажется, что все кнопки меню или подменю полностью заморожены.
Основываясь на комментировании некоторых строк, я уверен, что команда imageView.setRotate() вызывает проблему.
Вот мой код (основанный на уменьшенном, минимальном, но воспроизводимом примере):
My Main.java:

Код: Выделить всё

public class Main {
static void main(String[] args) {
GUI.launch(GUI.class, args);
}
}
GUI.java

Код: Выделить всё

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();
}
}
CalculationThread.java

Код: Выделить всё

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);
}
}
}
}
и CompassWindow.java

Код: Выделить всё

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);
}
}
Мой pom.xml

Код: Выделить всё


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








Добавьте любое изображение compass.png в resources-dir, создайте его с помощью mvn clean package -U и запустите его с помощью java -jar ImageViewExample.jar.
Может ли кто-нибудь дать мне подсказку, почему строка меню/элементы зависают и как этого избежать? Может быть, есть другая возможность прослушать изменение ползунка и позволить ImageView вращаться?

Подробнее здесь: https://stackoverflow.com/questions/798 ... bar-freeze
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»