我已经将一些 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();
}
}