如何在高DPI屏幕上使Java Swing应用程序GUI正确缩放以适应用户?
请参见下面的屏幕截图。在顶部,您可以看到与Ubuntu的文件浏览器图标和gedit相比,该应用程序的外观多么小。在左下角,您可以大致看到应用程序的尺寸(在常规DPI监视器上也可以看到)。因此,我正在寻找一种在使用高DPI监视器时正确缩放应用程序GUI的方法。例如,gedit在常规DPI和高DPI监视器上看起来都相同。我希望我的应用程序具有这种行为。
以下是该应用的源代码:https://github.com/baobabKoodaa/baopass
这是一个影响许多应用程序的极其普遍的问题。我在Ubuntu上运行的应用程序中大约有一半可以正确缩放,而无需用户采取任何操作,另一半没有缩放,而且看起来很小。请注意,我主要是在寻找一种不需要用户采取任何措施的解决方案(尽管目前已经获得了任何帮助,但我还没有找到任何扩展它的方法)。
根据this缩放比例应该已经可以使用。没有。除了在Java 9上运行应用程序外,我不确定这是否是错误或是否应该执行其他步骤?
答案 0 :(得分:4)
您必须告诉图形库按比例放大应用程序。
GDK_SCALE = 2 ./应用程序
将在环境中设置适当的信息,并且小部件将按比例缩放渲染,以便每个像素有效地占用四个像素的足迹。
请注意,在加载整个Swing库之后,不会显示启动屏幕(如果使用Java的启动屏幕支持),因此无论您尝试进行何种设置,启动屏幕都不会缩放。
在某些平台上,例如Fedora的Linux发行版,也可以进行部分缩放,从而可以设置GDK_SCALE = 1.5。请记住,它不是通用的,并且不能设置为您可能想要的任何缩放比例。
最后,较早的JVM完全忽略了此设置,因此,如果您不使用Java 9或更高版本启动,则可能无法正常工作。而且,当然,针对较旧的JVM和不同的操作系统进行调整的方式往往会有所不同(如果它们可以工作的话)。
答案 1 :(得分:0)
您好,这个问题有点模棱两可,但是您是否要实现这一目标:
private void makeFrameAdjust2YourSize(JFrame aFrame)
{
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
//use your own percentage for width and height like = 0.8 * screenSize.width to cover %80 of screen width
aFrame.setSize(screenSize.width, screenSize.height);
}
请记住,如果您为控制台应用程序使用多个监视器,则可能需要付出更多努力。
希望有帮助
答案 2 :(得分:0)
根据帖子中的link:
开发人员可以手动缩放应用程序中的所有GUI元素 在HiDPI显示器上运行时,但这需要很多 应用程序以及Swing和AWT组件的重构工作 没有写成与从 外面。
如果您很幸运,并且应用程序对更改字体大小的响应很好(不会失真),则可以尝试缩放不同屏幕尺寸的默认外观字体大小。
这是一个简单的演示,假定基本屏幕宽度为1400(表示此宽度的应用看起来不错):
public static void main(String[] args) {
SwingUtilities.invokeLater(() ->{
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException
| UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
setDefaultSize(getScaleForScreenSize());
//todo start GUI
});
}
private static double getScaleForScreenSize() {
double screenSize = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
return screenSize / 1400; //assuming app looks good at 1400
}
//source: https://stackoverflow.com/a/26877737/3992939
private static void setDefaultSize(double scale) {
Set<Object> keySet = UIManager.getLookAndFeelDefaults().keySet();
Object[] keys = keySet.toArray(new Object[keySet.size()]);
for (Object key : keys) {
if ((key != null) && key.toString().toLowerCase().contains("font")) {
Font font = UIManager.getDefaults().getFont(key);
if (font != null) {
font = font.deriveFont((float)(scale * font.getSize()));
UIManager.put(key, font);
}
}
}
}
答案 3 :(得分:0)
您似乎正在使用Linux。您可以使用命令行开关
java -Dsun.java2d.uiScale=2 -jar some_application.jar
来自https://wiki.archlinux.org/index.php/HiDPI#Java_applications