java - 这可以在 Mac OSX 上实现吗?

标签 java macos swing

我尝试使用以下代码使我的 JFrame 出现在 Mac OSX 上的扩展坞旁边,但它不起作用。是否有可能让框架出现在那里?我正在使用 Java。

frame.setLocation(5, Toolkit.getDefaultToolkit().getScreenSize().height-45);

这是我总是得到的:
enter image description here

这就是我想要实现的目标:
enter image description here

最佳答案

可以,但您需要使用 GraphicsDeviceGraphicsEnvironmentGraphicsConfiguration API

Toolkit#getScreenSize 就是这样做的,它返回屏幕的大小,但它不包括所有操作系统元素,例如扩展坞,它们会占用额外的空间

Sitting upon the dock

所以,这是一堆库代码,旨在查找特定组件所在的 GraphicsDevice,或者默认的 GraphicsDevice ...库代码;)

public static Rectangle getDefaultScreenBounds() {
    return getScreenBounds(null, true);
}

public static Rectangle getScreenBounds(Component comp, boolean acceptDefault) {
    Rectangle bounds = getScreenBounds(comp);
    if ((bounds == null || (bounds.x == 0 && bounds.y == 0 && bounds.width == 0 && bounds.height == 0)) && acceptDefault) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        bounds = gd.getDefaultConfiguration().getBounds();
    }
    return bounds;
}

public static Rectangle getScreenBounds(Component comp) {
    Rectangle bounds = new Rectangle(0, 0, 0, 0);
    GraphicsDevice gd = getGraphicsDevice(comp);

    if (gd != null) {
        GraphicsConfiguration gc = gd.getDefaultConfiguration();
        bounds = gc.getBounds();
    }
    return bounds;
}

public static GraphicsDevice getGraphicsDevice(Component comp) {
    GraphicsDevice device = null;
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice lstGDs[] = ge.getScreenDevices();
    List<GraphicsDevice> lstDevices = new ArrayList<>(lstGDs.length);
    if (comp != null && comp.isVisible()) {
        Rectangle parentBounds = comp.getBounds();
        /*
         * If the component is not a window, we need to find its location on the
         * screen...
         */
        if (!(comp instanceof Window)) {
            Point p = new Point(0, 0);
            SwingUtilities.convertPointToScreen(p, comp);
            parentBounds.setLocation(p);
        }

        for (GraphicsDevice gd : lstGDs) {
            GraphicsConfiguration gc = gd.getDefaultConfiguration();
            Rectangle screenBounds = gc.getBounds();
            if (screenBounds.intersects(parentBounds)) {
                lstDevices.add(gd);
            }
        }
        if (lstDevices.size() == 1) {
            device = lstDevices.get(0);
        } else {
            GraphicsDevice gdMost = null;
            float maxArea = 0;

            for (GraphicsDevice gd : lstDevices) {
                GraphicsConfiguration gc = gd.getDefaultConfiguration();
                Rectangle bounds = gc.getBounds();

                Rectangle2D intBounds = bounds.createIntersection(parentBounds);
                float perArea = (float) ((intBounds.getWidth() * intBounds.getHeight()) / (parentBounds.width * parentBounds.height));
                if (perArea > maxArea) {
                    maxArea = perArea;
                    gdMost = gd;
                }
            }
            if (gdMost != null) {
                device = gdMost;
            }
        }
    }

    return device;
}

而且,这就是你可以使用它的方式......

package javaapplication1.pkg169;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Window;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                Rectangle bounds = getDefaultScreenBounds();
                System.out.println(bounds);
                int x = bounds.x + ((bounds.width - frame.getWidth()) / 2);
                frame.setLocation(x, bounds.y + (bounds.height - frame.getHeight()));
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

    public static Rectangle getDefaultScreenBounds() {
        return getScreenBounds(null, true);
    }

    public static Rectangle getScreenBounds(Component comp, boolean acceptDefault) {
        Rectangle bounds = getScreenBounds(comp);
        if ((bounds == null || (bounds.x == 0 && bounds.y == 0 && bounds.width == 0 && bounds.height == 0)) && acceptDefault) {
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            GraphicsDevice gd = ge.getDefaultScreenDevice();
            bounds = gd.getDefaultConfiguration().getBounds();
        }
        return bounds;
    }

    public static Rectangle getScreenBounds(Component comp) {
        Rectangle bounds = new Rectangle(0, 0, 0, 0);
        GraphicsDevice gd = getGraphicsDevice(comp);

        if (gd != null) {
            GraphicsConfiguration gc = gd.getDefaultConfiguration();
            bounds = gc.getBounds();
        }
        return bounds;
    }

    public static GraphicsDevice getGraphicsDevice(Component comp) {
        GraphicsDevice device = null;
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice lstGDs[] = ge.getScreenDevices();
        List<GraphicsDevice> lstDevices = new ArrayList<>(lstGDs.length);
        if (comp != null && comp.isVisible()) {
            Rectangle parentBounds = comp.getBounds();
            /*
             * If the component is not a window, we need to find its location on the
             * screen...
             */
            if (!(comp instanceof Window)) {
                Point p = new Point(0, 0);
                SwingUtilities.convertPointToScreen(p, comp);
                parentBounds.setLocation(p);
            }

            for (GraphicsDevice gd : lstGDs) {
                GraphicsConfiguration gc = gd.getDefaultConfiguration();
                Rectangle screenBounds = gc.getBounds();
                if (screenBounds.intersects(parentBounds)) {
                    lstDevices.add(gd);
                }
            }
            if (lstDevices.size() == 1) {
                device = lstDevices.get(0);
            } else {
                GraphicsDevice gdMost = null;
                float maxArea = 0;

                for (GraphicsDevice gd : lstDevices) {
                    GraphicsConfiguration gc = gd.getDefaultConfiguration();
                    Rectangle bounds = gc.getBounds();

                    Rectangle2D intBounds = bounds.createIntersection(parentBounds);
                    float perArea = (float) ((intBounds.getWidth() * intBounds.getHeight()) / (parentBounds.width * parentBounds.height));
                    if (perArea > maxArea) {
                        maxArea = perArea;
                        gdMost = gd;
                    }
                }
                if (gdMost != null) {
                    device = gdMost;
                }
            }
        }

        return device;
    }

}

关于java - 这可以在 Mac OSX 上实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43466795/

相关文章:

java - 爆炸式发展是什么意思? (在 Java 中)

java - 如何使用 owlexplanation 项目获得不一致的解释

macos - 如何让shell脚本等待pkg完成安装

java - 将起始字母字符与数字字符分开

java - 如何让进度条在recyclerview中不可见

java - JFrame 主题和外观

java - 继承和调用方法(实例与非实例)

java - 实现 JFrame 时线程 "main"java.lang.NullPointerException 中出现异常

objective-c - ARC 使用了太多内存

c# - 如何在 Mac OSX 中安装 C#