Ubuntu 22.04 上的 JavaFX 无法像在 Windows 10 上那样运行

Ubuntu 22.04 上的 JavaFX 无法像在 Windows 10 上那样运行

我已经将一些 JAVA 应用程序从 Windows 10 移植到 Ubuntu 22.04(它与 Windows 一起运行)。一些数据:

  • Acer e15。360 GB Ubuntu 分区
  • JavaJDK-9.0.4(我不会升级,因为 JavaFX 是 JDK 的一部分,它省去了我处理 Open JavaFX 的麻烦)适用于 Windows 和 Ubuntu。

大多数应用程序运行良好。但是我注意到 JavaFX GraphicsContext 在 Ubuntu 上无法与 Image 配合使用。在 Windows 10 上,它可以正常工作。代码如下

  scopter = new Image(getClass().getResourceAsStream("scopter.jpg"));
  Canvas screen = new Canvas(580, 500);
  gc = screen.getGraphicsContext2D();
  ...
  private void draw( ) {
    gc.setFill(Color.BLACK);
    gc.fillRect(0,0,580,580);
    gc.setFill(Color.RED);
    gc.drawImage(scopter, sX, sY); // <---Trouble is HERE
    if (mode) { // pick-up mode
      if (home > 1) { // chopper home
        gc.fillOval(cX, cY, 15, 15);
      } else if (home > 0) { // cargo home
        gc.fillOval(sX+DX, sY+DY, 15, 15);
      } else { // on fetching cargo
        if (home < 0) { // outbound
          gc.setStroke(Color.RED);
          gc.fillOval(cargoX, cargoY, 15, 15);
          gc.strokeText("Invalid Cargo Location.", 200, 250);
        } else gc.fillOval(cX, cY, 15, 15);
      }
    } else { // delivery mode
      if (home > 0) { // chopper home
        gc.fillOval(dX, dY, 15, 15);
      } else { // on fetching cargo
        if (home < 0) { // outbound
          gc.setStroke(Color.RED);
          gc.fillOval(cargoX, cargoY, 15, 15);
          gc.strokeText("Invalid Cargo Location.", 200, 250);
        } else {
          if (delivery > 0) {
            gc.fillOval(sX+DX, sY+DY, 15, 15);
          } else gc.fillOval(cargoX, cargoY, 15, 15);
        }
      }
      if (dX > 0) {
        gc.setFill(Color.WHITE);
        gc.fillOval(dX+5, dY+5, 5, 5);
      }
    }
    gc.setLineWidth(1);
    gc.setStroke(Color.YELLOW);
    gc.strokeText("FuzzyLogic Controlled Aerial Chopper - Joe Nartca (C) -", 124, 15);
    gc.strokeText(String.format("Speed %3.2f, Chopper %3.2f / %3.2f (cargo %3.2f / %3.2f)",
                                speed, sX, sY, cX, cY), 108, 30);
    gc.setStroke(Color.CYAN);
    gc.strokeText(String.format("Distance to TARGET and GOAL  %3.2f / %3.2f",
                                deltaX, deltaY),5, 495);
    if (oX != 0) {
      gc.setFill(Color.web("#a9ff00"));
      gc.fillOval(oX, oY, 20, 20);
    }
  }

屏幕布局 并且我们可以看到望远镜图像除此之外,红球不会出现。问题是:这是 Ubuntu 22.04 还是 JavaFX-linux 的故障?

附言:这是Windows 上的图像

答案1

...我发现了这个问题,这让我开始思考这个错误是否是 JFX 错误(JDK 9.04)或者是 Ubuntu 的 JPG 图像问题。我缩小了我的 JFX 应用程序,并尝试在 JFX 画布上绘制 2 个图像:一个是JPG图像,另一个是巴布亚新几内亚图像。我看到的是 PNG 图像被绘制出来了,但是 JPG 图像却丢失了。这是简化的应用程序:

// JavaFX
import javafx.application.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.geometry.*;
import javafx.scene.canvas.*;
import javafx.scene.paint.Color;
import javafx.scene.image.Image;
// FuzzyLogic
import fuzzylogic.*;
//
// FuzzyLogic Controlled Unmanned Aerial Chopper
// Joe Nartca (C)
//
public class MissingImage extends Application {
  public void start(Stage stage) {
    stage.setTitle("FuzzyLogic Controlled Drone -JoeNartca (C)-");
    try {
        scopter_jpg = new Image(new java.io.FileInputStream("scopter.jpg"));
        scopter_png = new Image(new java.io.FileInputStream("scopter.png"));
    } catch (Exception ex) {
        ex.printStackTrace();
        System.exit(0);
    }
    Canvas screen = new Canvas(580, 500);
    gc = screen.getGraphicsContext2D();
     gc = screen.getGraphicsContext2D();
    // fill canvas
    draw( );
    //
    VBox root = new VBox(10);
    root.setAlignment(Pos.CENTER);
    root.setPadding(new Insets(5,5,5,5));
    root.getChildren().addAll(screen);
    Scene scene = new Scene(root, 590, 590);
    // either inline styling or via file css.css
    stage.setScene(scene);
    stage.show();
  }
  // clean up before terminated
  public void stop() {
    Platform.exit();
    System.exit(0);
  }
    // paint the Canvas
  private void draw( ) {
    gc.setFill(Color.BLACK);
    gc.fillRect(0,0,580,580);
    gc.setFill(Color.RED);
    gc.drawImage(scopter_jpg, 290, 290); // Draw JPG image
    gc.drawImage(scopter_png, 320, 320); // Draw PNG image
    gc.fillOval(535, 480, 15, 15);
    gc.fillOval(510, 480, 15, 15);
    gc.setLineWidth(1);
    gc.setStroke(Color.YELLOW);
    gc.strokeText("FuzzyLogic Controlled Flying Drone - Joe Nartca (C) -", 124, 15);
  }
  private Image scopter_jpg, scopter_png;
  private GraphicsContext gc;
  public static void main(String... argv) {
      Application.launch();
  }
}

截屏图片图像JPG 图像png图像PNG 图像

相关内容