【问题标题】:Adapt SWT UI elements according to display resolution根据显示分辨率适配 SWT UI 元素
【发布时间】:2016-12-16 13:25:41
【问题描述】:

我编写了一个 GUI 应用程序,每个 shell 都使用GridLayout。在为 1280*1024 屏幕编写之后,我意识到我应该让它在每个显示器上都可用,所以我添加了一个根据显示分辨率转换每个元素的高度和宽度的方法:

public static int widthconverter(double x){   
        int width = 0;
        width=(int) ((x/1280.0)*screenWidth);
        return width;
    }
public static int heightconverter(double x){
        int height = 0;
        height=(int) ((x/1024.0)*screenHeight);
        return height;
    }

这并不像我想要的那样工作。例如,使用 800*600 分辨率时,外壳会调整大小,但宽度和高度有点太小,无法覆盖所有包含的元素。转到 4K 显示它也不能按需要工作。

非常感谢任何解决此问题的想法。

【问题讨论】:

  • 如前所述,我对所有 shell 都使用了 GridLayout。
  • 如果您认为某个答案解决了问题,请单击绿色复选标记将其标记为“已接受”。这有助于将注意力集中在仍然没有答案的旧帖子上。
  • 抱歉,没有解决我的问题的答案。还是要谢谢你的帮助。同时我自己想通了:
  • 不需要调整字体大小,但是对于外壳和标签和文本字段,我编写了一个根据屏幕分辨率转换宽度和高度的方法(见上文)。唯一缺少的是一个占宽度和高度比例的比例因子(在 1280/1024=1.25 的情况下)。

标签: java user-interface resize swt display


【解决方案1】:

您根本不应该以像素为单位指定绝对大小。

在许多情况下,控件的大小取决于其内容。通常要显示的字符的尺寸给出了一个很好的基本测量单位。下面的代码 sn-p 可以作为模板来确定字符串的大小(以像素为单位)。

Control control = ...
FontData[] fontData = control.getFont().getFontData();
GC gc = new GC( control );
Point size = gc.stringExtent( "Abc" );
// or
int height = gc.getFontMetrics().getHeight();
int avgWidth = gc.getFontMetrics().getAverageCharWidth();
gc.dispose();

要确定控件将占用多少像素来显示给定文本,需要添加控件的修剪。例如

Rectangle trim = control.computeTrim( 0, 0, size.x, size.y );

如果使用GridLayout,则可以将widthHintheightHint 设置为trim 的相应字段。

这是一种设计用户界面以适应多种屏幕分辨率的简单方法。

自 Eclipse 4.6 发布以来,SWT 还提供了用于为高分辨率监视器加载图像的 API。如果您为不同的屏幕分辨率提供图像,SWT 会选择一个合适的。 JFace 和 Eclipse Platform/UI 等上层也增加了对不同图像分辨率的支持。

另见:

【讨论】:

    【解决方案2】:

    为遇到相同问题的人解决了我的问题的代码:

    static double screenWidth= screen.getWidth(); 
    static double screenHeight=screen.getHeight(); 
    int pixelPerInch=java.awt.Toolkit.getDefaultToolkit().getScreenResolution(); 
    static double scalingFactorheight=(screenWidth/screenHeight)/1.25;
    
    public static int widthconverter(double x){
        int width = 0;
        width=(int) ((x/1280.0)*screenWidth);
        return width;
    }
    
    public static int heightconverter(double x){
        int height = 0;
        height=(int) ((x/1024.0)*screenHeight*scalingFactorheight);
        return height;
    }
    

    【讨论】:

    • 从 Neon 开始,用户不应该担心缩放因子。 SWT 负责这一点。 SWT/eclipse api 中指定的大小以点为单位(以像素为单位的大小/比例因子)。上面的代码应该是必需的。仅当您使用 100% 比例因子时,您才会获得以像素为单位的 aboulutes 大小。其他所有时间都相对于监视器的缩放因子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    相关资源
    最近更新 更多