根据显示分辨率调整SWT UI元素

时间:2016-12-16 13:25:42

标签: java user-interface resize swt display

我已经编写了一个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显示它也不能按需工作。

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

2 个答案:

答案 0 :(得分:1)

你根本不应该以像素为单位指定绝对尺寸。

在许多情况下,控件的大小由其内容决定。通常,要显示的字符的尺寸给出了良好的基础测量单位。下面的代码段可以用作模板来确定字符串的大小。

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 );

如果使用GridLayoutwidthHintheightHint可以设置为trim的相应字段。

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

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

另见:

答案 1 :(得分:0)

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

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;
}