Java 应用程序终止远程 Xvnc 服务器
Java application kills remote Xvnc server
首先我会说我是 Java UI 开发的新手。所有涉及的机器都是 运行ning RHEL6。 Java 是 OpenJDK 1.7。我有一个应用程序(请原谅打字错误;我不得不从无互联网环境中手动复制):
import javax.swing.*;
import java.awt.*;
class TestApp{
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
Font[] fonts = e.getAllFonts();
for (Font font: fonts){
System.out.println(font.getFontName());
}
JTextArea text_pane = new JTextArea();
System.out.println("Using " + text_pane.getFont().getFontName());
text_pane.setText("HI");
JFrame j = new JFrame();
j.add(text_pane);
j.setSize(new Dimension(100,100));
j.setVisible(true);
}
});
}
}
如您所见,所有这一切都是打印所有可用的字体系列,打印默认字体系列,并显示 window 和一些文本。当我在本地 运行 时,它工作正常。我有一台远程机器 运行ning TurboVnc(turbo1.1) 显示:99,用命令
启动
./Xvnc :99 -geometery 1000x1000 -ac
如果我将我的应用程序 scp 到远程机器,导出 DISPLAY=:99.0,然后 运行 它,它工作正常。但是,如果我尝试在本地 运行 我的应用程序并将显示导出到 remotehost:99.0,则远程 Xvnc 服务器会因双重释放或损坏而崩溃。在回溯中,我看到一个 AddGlyph 调用。我对 X 的有限经验使我相信这是一个字体问题,即本地 运行ning 应用程序正在尝试使用远程计算机上不可用的字体。
System.out.println("Using " + text_pane.getFont().getFontName());
call 在任何一台机器上 运行 时确实打印出相同的字体名称 (Dialog.plain),但我不确定这是否真的意味着什么。有办法解决这个问题吗?我是不是完全从错误的角度来看待这个问题?我应该注意到 xeyes 和 xterm 运行 从本地机器导出到远程显示器时很好,只是我的 Java 应用程序杀死了它。
如果有人偶然发现这个:问题是我的 Java 版本足够新,它默认启用 xrender,但远程服务器上的 Xvnc 版本很旧,不支持它。使用
启动应用程序
-Dsun.java2d.xrender=false
已解决问题。
首先我会说我是 Java UI 开发的新手。所有涉及的机器都是 运行ning RHEL6。 Java 是 OpenJDK 1.7。我有一个应用程序(请原谅打字错误;我不得不从无互联网环境中手动复制):
import javax.swing.*;
import java.awt.*;
class TestApp{
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
Font[] fonts = e.getAllFonts();
for (Font font: fonts){
System.out.println(font.getFontName());
}
JTextArea text_pane = new JTextArea();
System.out.println("Using " + text_pane.getFont().getFontName());
text_pane.setText("HI");
JFrame j = new JFrame();
j.add(text_pane);
j.setSize(new Dimension(100,100));
j.setVisible(true);
}
});
}
}
如您所见,所有这一切都是打印所有可用的字体系列,打印默认字体系列,并显示 window 和一些文本。当我在本地 运行 时,它工作正常。我有一台远程机器 运行ning TurboVnc(turbo1.1) 显示:99,用命令
启动./Xvnc :99 -geometery 1000x1000 -ac
如果我将我的应用程序 scp 到远程机器,导出 DISPLAY=:99.0,然后 运行 它,它工作正常。但是,如果我尝试在本地 运行 我的应用程序并将显示导出到 remotehost:99.0,则远程 Xvnc 服务器会因双重释放或损坏而崩溃。在回溯中,我看到一个 AddGlyph 调用。我对 X 的有限经验使我相信这是一个字体问题,即本地 运行ning 应用程序正在尝试使用远程计算机上不可用的字体。
System.out.println("Using " + text_pane.getFont().getFontName());
call 在任何一台机器上 运行 时确实打印出相同的字体名称 (Dialog.plain),但我不确定这是否真的意味着什么。有办法解决这个问题吗?我是不是完全从错误的角度来看待这个问题?我应该注意到 xeyes 和 xterm 运行 从本地机器导出到远程显示器时很好,只是我的 Java 应用程序杀死了它。
如果有人偶然发现这个:问题是我的 Java 版本足够新,它默认启用 xrender,但远程服务器上的 Xvnc 版本很旧,不支持它。使用
启动应用程序-Dsun.java2d.xrender=false
已解决问题。