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

时间:2010-12-08 13:31:47

标签: java swing

我正试图找出我的两个显示器中的哪一个是JFrame。

我感谢任何帮助;)

2 个答案:

答案 0 :(得分:1)

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

使用此功能可以获得屏幕的总维度:

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

答案 1 :(得分:1)

有时候我会欣赏后来的解决方案(甚至在提出问题后几年发布)。这是我对同一问题的更复杂的解决方案(最初基于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;
}

DeviceConfig返回值的上下文中重新定义null类(在上面的注释中提到):

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

为所有读者提供Post Scriptum:您可以简化(或推进)此示例以满足您的需求......

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