java fx - различное поведение в зависимости от контекста - PullRequest
0 голосов
/ 28 марта 2020

мои извинения, если это легко для вас, но мой разум поражает. После нескольких лет отсутствия программирования я работаю над любимым проектом (игровой движок на 2d-плитке), где я хотел бы использовать Java FX без головы, чтобы использовать графические возможности. Из здесь и здесь

я понял, что вам нужно Java FX-приложение для инициализации графической системы. Поэтому я в основном взял пример ImageViewer и реализовал Runnable:

package net.ck.game.test;

import java.io.BufferedReader;
import java.util.ArrayList;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Logger;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class ImageTest extends Application implements Runnable {

    protected static final Logger logger = (Logger) LogManager.getLogger(ImageTest.class);
    BufferedReader x;
    @Override public void start(@SuppressWarnings("exports") Stage stage) {

        logger.error(Thread.currentThread().getName() + ", executing run() method!");

        Image standardImage = new Image("file:graphics/image1.png");

        logger.error("image height image1: "+ standardImage.getHeight());
        logger.error("image width image1:" + standardImage.getWidth());

        Image movingImage = new Image("file:graphics/image2.png");
        ArrayList<Image> images = new ArrayList<Image>();
        images.add(movingImage);
        images.add(standardImage);
        ImageView iv1 = new ImageView();
        iv1.setImage(standardImage);
        ImageView iv2 = new ImageView();
        iv2.setImage(movingImage);
        Group root = new Group();
        Scene scene = new Scene(root);
        scene.setFill(Color.BLACK);
        HBox box = new HBox();
        box.getChildren().add(iv1);
        box.getChildren().add(iv2);
        root.getChildren().add(box);

        stage.setTitle("ImageView");
        stage.setWidth(415);
        stage.setHeight(200);
        stage.setScene(scene); 
        stage.sizeToScene(); 
        stage.show(); 
    }

    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void run() 
    {
        Application.launch(ImageTest.class);        
    }
}

Когда я запускаю это как свое собственное приложение, оно работает нормально и отображает два изображения, которые я хочу, чтобы оно отображало.

Когда Я запускаю его так в конструкторе «игры»:

public class Game {
private boolean animated;

    public boolean isAnimated() {
        return animated;
    }

    public void setAnimated(boolean animated) {
        this.animated = animated;
    }

public Game() {
        setAnimated(true);


        if (isAnimated() ==  true)
        {
            ImageTest imageTest = new ImageTest();
            new Thread(imageTest).start();
        }
}

Нет ошибок, ImageTest запускается в своем собственном потоке, окно приложения открывается, но оно пустое. Я не понимаю этого вообще, почему это? Может, кто-то может пролить свет на это?

ОБНОВЛЕНИЕ: Я случайно столкнулся с разными рабочими условиями. Исправление этой проблемы решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...