获取JFrame所在显示器的屏幕设备信息。

4
我正在尝试找出JFrame在哪个显示器上。
非常感谢您的帮助 ;)
2个回答

4
有时候我欣赏更晚发布的解决方案(即使是在问题提出数年后)。这是我对同一个问题的更复杂的解决方案(最初基于Oracle文档)...
祝愉快...
// First some imports (it could spare your time)…
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Window;

辅助类的定义:

/**
 * This class just stores indexes and instances of a graphics device and
 * one of its configurations (within current graphics environment).
 */
public class DeviceConfig
{
    public int deviceIndex = 0;
    public int configIndex = 0;
    public GraphicsDevice device = null;
    public GraphicsConfiguration config = null;
}

执行任务的方法定义:

/**
 * This method finds the graphics device and configuration by the location
 * of specified window.
 *
 *  @param window  the window for which should be the identified the graphics
 *                 device and configuration
 *  @return instance of custom class type (DeviceConfig) that stores the
 *          indexes and instances of graphics device and configuration of
 *          current graphics environment
 */
public DeviceConfig findDeviceConfig(Window window)
{
    // Prepare default return value:
    DeviceConfig deviceConfig = new DeviceConfig();

    // More correct would be to return null when no device or configuration
    // has been found:
    //
    //  DeviceConfig deviceConfig = null;
    //
    // See also the comments marked by *** (below).

    Rectangle windowBounds = window.getBounds();
    int lastArea = 0;

    GraphicsEnvironment graphicsEnvironment =
        GraphicsEnvironment.getLocalGraphicsEnvironment();

    GraphicsDevice[] graphicsDevices =
        graphicsEnvironment.getScreenDevices();

    // Search through all devices…
    for (int i = 0; i < graphicsDevices.length; ++i)
    {
        GraphicsDevice graphicsDevice = graphicsDevices[i];

        GraphicsConfiguration[] graphicsConfigurations =
            graphicsDevice.getConfigurations();

        // It is possible that your device will have only one configuration,
        // but you cannot rely on this(!)…
        for (int j = 0; j < graphicsConfigurations.length; ++j)
        {
            GraphicsConfiguration graphicsConfiguration =
                graphicsConfigurations[j];

            Rectangle graphicsBounds =
                graphicsConfiguration.getBounds();

            Rectangle intersection = windowBounds.
                intersection(graphicsBounds);

            int area = intersection.width * intersection.height;

            if (0 != area)
            {
                // ***
                // The block of code in this comments is relevant in case you
                // want to return the null value when no device or
                // configuration has been found.
                /*
                if (null == deviceConfig)
                {
                    // In this case the better solution would be to declare
                    // the full constructor in the DeviceClass (see below) and
                    // use it here like this:

                    deviceConfig = new DeviceConfig(i, j,
                        graphicsDevice, graphicsConfiguration);

                    // (but the current solution is more simple when no
                    // constructor is defined)…

                }
                else
                */

                if (area > lastArea)
                {
                    lastArea = area;
                    deviceConfig.deviceIndex = i;
                    deviceConfig.configIndex = j;
                    deviceConfig.device = graphicsDevice;
                    deviceConfig.config = graphicsConfiguration;
                }
            }
        }
    }

    return deviceConfig;
}

在上面提到的null返回值的情况下,重新定义DeviceConfig类:

// ***
// The DeviceConfig class with constructors would look like this:

public class DeviceConfig
{
    public int deviceIndex;
    public int configIndex;
    public GraphicsDevice device;
    public GraphicsConfiguration config;

    /** The default constructor. (Would not be used in the second case.) */
    public DeviceConfig()
    {
        deviceIndex = 0;
        configIndex = 0;
        device = null;
        config = null;
    }

    /** The full constructor. */
    public DeviceConfig(int i, int j,
        GraphicsDevice graphicsDevice,
        GraphicsConfiguration graphicsConfiguration)
    {
        deviceIndex = i;
        configIndex = j;
        device = graphicsDevice;
        config = graphicsConfiguration;
    }
}

所有读者的后记: 您可以根据您的需求简化(或提高)此示例...

(希望它有所帮助...;-))


1

使用getLocation()获取帧的左上角坐标。根据您的屏幕布局和分辨率,您需要计算它所在的屏幕。

另一个有用的方法是通过以下方式获取屏幕的总尺寸:

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接