【问题标题】:Change screen resolution in Java在 Java 中更改屏幕分辨率
【发布时间】:2012-06-28 19:41:24
【问题描述】:

我有一个程序使用可视化脚本 (sikuli-script) 允许用户创建自己的可视化脚本。该程序需要跨可能具有不同屏幕分辨率的多个系统工作。

Sikuli 逐个像素匹配突出显示的图像,因此在不同分辨率的系统上将无法找到图像。

那么有没有办法通过java代码改变windows中的分辨率设置?

全屏不是一个选项,因为需要捕获的图像来自不同的软件包,即我的软件包位于图像需要来自的位置上方(并且在进行捕获时被最小化)

【问题讨论】:

    标签: java swing screen-resolution sikuli


    【解决方案1】:

    因此,有没有一种方法可以通过 java 代码更改 windows 中的分辨率设置?

    1.yes 是可能的,为什么不呢

    import java.awt.Color;
    import java.awt.DisplayMode;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.GraphicsConfiguration;
    import java.awt.GraphicsDevice;
    import java.awt.GraphicsEnvironment;
    import java.awt.Rectangle;
    import java.awt.image.BufferStrategy;
    
    public class MultiBufferTest {
    
        private Frame mainFrame;
        private static Color[] COLORS = new Color[]{
            Color.red, Color.blue, Color.green, Color.white, Color.black,
            Color.yellow, Color.gray, Color.cyan, Color.pink, Color.lightGray,
            Color.magenta, Color.orange, Color.darkGray};
        private static DisplayMode[] BEST_DISPLAY_MODES = new DisplayMode[]{
            new DisplayMode(640, 480, 32, 0),
            new DisplayMode(640, 480, 16, 0),
            new DisplayMode(640, 480, 8, 0)};
    
        public MultiBufferTest(int numBuffers, GraphicsDevice device) {
            try {
                GraphicsConfiguration gc = device.getDefaultConfiguration();
                mainFrame = new Frame(gc);
                mainFrame.setUndecorated(true);
                mainFrame.setIgnoreRepaint(true);
                device.setFullScreenWindow(mainFrame);
                if (device.isDisplayChangeSupported()) {
                    chooseBestDisplayMode(device);
                }
                Rectangle bounds = mainFrame.getBounds();
                mainFrame.createBufferStrategy(numBuffers);
                BufferStrategy bufferStrategy = mainFrame.getBufferStrategy();
                for (float lag = 2000.0f; lag > 0.00000006f; lag = lag / 1.33f) {
                    for (int i = 0; i < numBuffers; i++) {
                        Graphics g = bufferStrategy.getDrawGraphics();
                        if (!bufferStrategy.contentsLost()) {
                            g.setColor(COLORS[i]);
                            g.fillRect(0, 0, bounds.width, bounds.height);
                            bufferStrategy.show();
                            g.dispose();
                        }
                        try {
                            Thread.sleep((int) lag);
                        } catch (InterruptedException e) {
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                device.setFullScreenWindow(null);
            }
        }
    
        private static DisplayMode getBestDisplayMode(GraphicsDevice device) {
            for (int x = 0; x < BEST_DISPLAY_MODES.length; x++) {
                DisplayMode[] modes = device.getDisplayModes();
                for (int i = 0; i < modes.length; i++) {
                    if (modes[i].getWidth() == BEST_DISPLAY_MODES[x].getWidth()
                            && modes[i].getHeight() == BEST_DISPLAY_MODES[x].getHeight()
                            && modes[i].getBitDepth() == BEST_DISPLAY_MODES[x].getBitDepth()) {
                        return BEST_DISPLAY_MODES[x];
                    }
                }
            }
            return null;
        }
    
        public static void chooseBestDisplayMode(GraphicsDevice device) {
            DisplayMode best = getBestDisplayMode(device);
            if (best != null) {
                device.setDisplayMode(best);
            }
        }
    
        public static void main(String[] args) {
            try {
                int numBuffers = 2;
                if (args != null && args.length > 0) {
                    numBuffers = Integer.parseInt(args[0]);
                    if (numBuffers < 2 || numBuffers > COLORS.length) {
                        System.err.println("Must specify between 2 and " + COLORS.length + " buffers");
                        System.exit(1);
                    }
                }
                GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
                GraphicsDevice device = env.getDefaultScreenDevice();
                MultiBufferTest test = new MultiBufferTest(numBuffers, device);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.exit(0);
        }
    }
    

    2.不要那样做,可能会惹恼用户,并且在缺少代码的情况下可以更改 Native OS 中的分辨率(我的同事在三个屏幕上有超过 100 个快捷方式,任何更改分辨率都可以更改快照 size 和 @ 987654325@,结果一团糟)

    3.将JLabel 用于Icons(将LayoutManager 放入容器中),或将Icons 放入JListJTable,那么您永远/不关心某事

    4.仅使用LayoutManager而不是定位或更改屏幕分辨率,您可以在屏幕上为Apps start_up设置更小的Size(用于JFrame),让用户决定最终的Dimmension on她/他的屏幕

    【讨论】:

    • 为代码干杯,但我需要更改 Native OS 中的分辨率,因为我的软件将最小化以允许用户从下面运行的软件中选择参数。如果无法通过代码更改本机操作系统的屏幕分辨率,有没有办法通过代码找出它是什么?
    • 不要那样做,(-:我只会运行一次你的代码,没有人可以说服我再次运行它 :-),简单且只有全屏才有可能(不影响最终用户桌面)
    • 好吧,全屏不是一个选项,因此如果需要,必须指示用户手动更改它。它是在 PC 上运行的高度定制的软件,仅用于控制某些实验室设备,因此更改最终用户桌面不是问题,因为另一种选择是软件无法正常工作
    • javacoffeebreak.com/faq/faq0015.html : 返回当前屏幕分辨率
    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多