无法在Ubuntu服务器上使用JavaFX打开DISPLAY

时间:2018-07-28 01:56:23

标签: java javafx javafx-8 xvfb

我有一个简单的应用程序,它基于JavaFX生成图表的png。该应用无法在无显示计算机上运行,​​但有以下例外,我不需要在控制台上呈现或显示内容,只需要创建图像即可。

"main" java.lang.UnsupportedOperationException: Unable to open DISPLAY
    at com.sun.glass.ui.gtk.GtkApplication.<init>(GtkApplication.java:68)
    at com.sun.glass.ui.gtk.GtkPlatformFactory.createApplication(GtkPlatformFactory.java:41)
    at com.sun.glass.ui.Application.run(Application.java:146)
    at com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:257)
    at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:211)
    at javafx.embed.swing.JFXPanel.initFx(JFXPanel.java:215)
    at javafx.embed.swing.JFXPanel.<init>(JFXPanel.java:230)

我正在尝试在AWS实例上运行它。有没有办法解决这个问题?以下是我的示例代码。

import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.embed.swing.JFXPanel;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import javax.imageio.ImageIO;

public class Test {

    public static void main(String[] args) {

        String chartGenLocation = "/Users/tmp";
        new JFXPanel();
        ObservableList<PieChart.Data> pieChartData =
                FXCollections.observableArrayList(
                        new PieChart.Data("Failed", 10),
                        new PieChart.Data("Skipped", 20));
        final PieChart chart = new PieChart(pieChartData);
        chart.setAnimated(false);
        Platform.runLater(() -> {
            Stage stage = new Stage();
            Scene scene = new Scene(chart, 500, 500);
            stage.setScene(scene);
            WritableImage img = new WritableImage(500, 500);
            scene.snapshot(img);

            File file = new File(Paths.get(chartGenLocation, "a.png").toString());
            try {
                ImageIO.write(SwingFXUtils.fromFXImage(img, null), "png", file);
            } catch (IOException e) {
                //logger.error("Error occurred while writing the chart image
            }
        });
    }
}

我几乎看不到SO的答案,这些答案主要涉及monocle和testfx,在这里我无法添加外部依赖项。因此,添加testfx并不是一种选择。我也尝试过使用xvbf进行以下操作,它会挂起系统,

Xvfb :95 -screen 0 1024x768x16 &> xvfb.log &
export DISPLAY=:95.0

执行时,我看到以下输出,系统挂在那里。

(process:13112): Gtk-WARNING **: Locale not supported by C library.
    Using the fallback 'C' locale.
Fontconfig warning: ignoring UTF-8: not a valid region tag

更新

执行顺序

Xvfb :92 -screen 0 1024x768x16 &> xvfb.log &
export DISPLAY=:92.0

xvbf.log中没有错误,似乎可以正常启动。

java Test

我在控制台中看到以下内容

(process:13356): Gtk-WARNING **: Locale not supported by C library.
    Using the fallback 'C' locale.
Fontconfig warning: ignoring UTF-8: not a valid region tag

我在xvbf.log中看不到任何日志,在上述日志之后,执行没有进行。我的图片没有生成。

更新2

我想知道是否有一种绕过this validation的方法,因为我真的不需要显示渲染。

0 个答案:

没有答案