Получить информацию об устройстве экрана, на котором в данный момент находится JFrame - PullRequest
2 голосов
/ 08 декабря 2010

Я пытаюсь выяснить, на каком из моих двух дисплеев находится JFrame.

Я ценю любую помощь;)

Ответы [ 2 ]

1 голос
/ 19 ноября 2015

Иногда я ценю более поздние решения (опубликованные даже спустя годы после того, как вопрос был задан).Это мое более сложное решение той же проблемы (изначально основанное на документации Oracle)…

Enjoy…

// 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 для всех читателей: Вы можете упростить (или продвинуть) этот пример, чтобы соответствовать вашим потребностям ...

(надеюсь, это поможет ... ;-))

1 голос
/ 08 декабря 2010

Используйте getLocation(), чтобы получить координаты верхнего левого угла кадра. На основе вашего макета экрана и разрешения вам нужно будет рассчитать, на каком экране он находится.

Что может быть полезно, так это получить общий размер экранов, используя это:

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...