Определение размера экрана java

Как вы получаете ширину экрана в Java?

Кто-нибудь знает, как бы вы получили ширину экрана в Java? Я читал кое-что о некотором методе набора инструментов, но я не совсем уверен, что это такое.

12 ответов

java.awt.Toolkit.getDefaultToolkit().getScreenSize() 

Вот два метода, которые я использую, для учета нескольких мониторов и вставок панели задач. Если вам не нужны оба метода по отдельности, вы, конечно, можете избежать получения графической конфигурации дважды.

static public Rectangle getScreenBounds(Window wnd) < Rectangle sb; Insets si=getScreenInsets(wnd); if(wnd==null) < sb=GraphicsEnvironment .getLocalGraphicsEnvironment() .getDefaultScreenDevice() .getDefaultConfiguration() .getBounds(); >else < sb=wnd .getGraphicsConfiguration() .getBounds(); >sb.x +=si.left; sb.y +=si.top; sb.width -=si.left+si.right; sb.height-=si.top+si.bottom; return sb; > static public Insets getScreenInsets(Window wnd) < Insets si; if(wnd==null) < si=Toolkit.getDefaultToolkit().getScreenInsets(GraphicsEnvironment .getLocalGraphicsEnvironment() .getDefaultScreenDevice() .getDefaultConfiguration()); >else < si=wnd.getToolkit().getScreenInsets(wnd.getGraphicsConfiguration()); >return si; > 

Рабочая область — это область рабочего стола дисплея, исключая панели задач, закрепленные окна и закрепленные панели инструментов.

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

public static int GetScreenWorkingWidth() < return java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width; >public static int GetScreenWorkingHeight()

Следующий код должен это сделать (еще не пробовал):

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gd = ge.getDefaultScreenDevice(); gd.getDefaultConfiguration().getBounds().getWidth(); 

редактировать:

Для нескольких мониторов вы должны использовать следующий код (взят из Javadoc java.awt.GraphicsConfiguration :

 Rectangle virtualBounds = new Rectangle(); GraphicsEnvironment ge = GraphicsEnvironment. getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); for (int j = 0; j < gs.length; j++) < GraphicsDevice gd = gs[j]; GraphicsConfiguration[] gc = gd.getConfigurations(); for (int i=0; i < gc.length; i++) < virtualBounds = virtualBounds.union(gc[i].getBounds()); >> 

Инструментарий имеет ряд классов, которые помогут:

  1. getScreenSize — необработанный размер экрана
  2. getScreenInsets — получает размер панели инструментов, дока
  3. getScreenResolution — точек на дюйм
Читайте также:  Команда вывода на экран питон

В итоге мы используем 1 и 2, чтобы вычислить максимально допустимый размер окна. Чтобы получить соответствующую GraphicsConfiguration, мы используем

GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDefaultConfiguration(); 

но могут быть более умные решения для нескольких мониторов.

ОП, вероятно, хотел что-то вроде этого:

Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); 
Toolkit.getDefaultToolkit().getScreenSize().getWidth() 

Это улучшение мультимониторного решения, опубликованного (выше) Лоуренсом Долом. Как и в его решении, этот код учитывает несколько мониторов и вставок панели задач. Включенные функции: getScreenInsets (), getScreenWorkingArea () и getScreenTotalArea ().

Отличия от версии Lawrence Dol:

  • Это позволяет избежать получения графической конфигурации дважды.
  • Добавлена ​​функция получения общей площади экрана.
  • Переименованы переменные для ясности.
  • Добавлены Javadocs.
/** * getScreenInsets, This returns the insets of the screen, which are defined by any task bars * that have been set up by the user. This function accounts for multi-monitor setups. If a * window is supplied, then the the monitor that contains the window will be used. If a window * is not supplied, then the primary monitor will be used. */ static public Insets getScreenInsets(Window windowOrNull) < Insets insets; if (windowOrNull == null) < insets = Toolkit.getDefaultToolkit().getScreenInsets(GraphicsEnvironment .getLocalGraphicsEnvironment().getDefaultScreenDevice() .getDefaultConfiguration()); >else < insets = windowOrNull.getToolkit().getScreenInsets( windowOrNull.getGraphicsConfiguration()); >return insets; > /** * getScreenWorkingArea, This returns the working area of the screen. (The working area excludes * any task bars.) This function accounts for multi-monitor setups. If a window is supplied, * then the the monitor that contains the window will be used. If a window is not supplied, then * the primary monitor will be used. */ static public Rectangle getScreenWorkingArea(Window windowOrNull) < Insets insets; Rectangle bounds; if (windowOrNull == null) < GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); insets = Toolkit.getDefaultToolkit().getScreenInsets(ge.getDefaultScreenDevice() .getDefaultConfiguration()); bounds = ge.getDefaultScreenDevice().getDefaultConfiguration().getBounds(); >else < GraphicsConfiguration gc = windowOrNull.getGraphicsConfiguration(); insets = windowOrNull.getToolkit().getScreenInsets(gc); bounds = gc.getBounds(); >bounds.x += insets.left; bounds.y += insets.top; bounds.width -= (insets.left + insets.right); bounds.height -= (insets.top + insets.bottom); return bounds; > /** * getScreenTotalArea, This returns the total area of the screen. (The total area includes any * task bars.) This function accounts for multi-monitor setups. If a window is supplied, then * the the monitor that contains the window will be used. If a window is not supplied, then the * primary monitor will be used. */ static public Rectangle getScreenTotalArea(Window windowOrNull) < Rectangle bounds; if (windowOrNull == null) < GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); bounds = ge.getDefaultScreenDevice().getDefaultConfiguration().getBounds(); >else < GraphicsConfiguration gc = windowOrNull.getGraphicsConfiguration(); bounds = gc.getBounds(); >return bounds; > 

Источник

Определение размера экрана java

При разработке приложений под Android мы можем использовать различные типы измерений:

  • px : пиксели текущего экрана. Однако эта единица измерения не рекомендуется, так как реальное представление внешнего вида может изменяться в зависимости от устройства; каждое устройство имеет определенный набор пикселей на дюйм, поэтому количество пикселей на экране может также меняться
  • dp : (device-independent pixels) независимые от плотности экрана пиксели. Абстрактная единица измерения, основанная на физической плотности экрана с разрешением 160 dpi (точек на дюйм). В этом случае 1dp = 1px. Если размер экрана больше или меньше, чем 160dpi, количество пикселей, которые применяются для отрисовки 1dp соответственно увеличивается или уменьшается. Например, на экране с 240 dpi 1dp=1,5px, а на экране с 320dpi 1dp=2px. Общая формула для получения количества физических пикселей из dp: px = dp * (dpi / 160)
  • sp : (scale-independent pixels) независимые от масштабирования пиксели. Допускают настройку размеров, производимую пользователем. Рекомендуются для работы со шрифтами.
  • pt : 1/72 дюйма, базируются на физических размерах экрана
  • mm : миллиметры
  • in : дюймы

Предпочтительными единицами для использования являются dp. Это связано с тем, что мир мобильных устройств на Android сильно фрагментирован в плане разрешения и размеров экрана. И чем больше плотность пикселей на дюйм, тем соответственно больше пикселей нам будет доступно:

Разрешение экрана в Android

Используя же стандартные физические пиксели мы можем столкнуться с проблемой, что размеры элементов также будут сильно варьироваться в зависимости от плотности пикселей устройства. Например, возьмем 3 устройства с различными характеристиками экрана Nexus 4, Nexus 5X и Nexus 6P и выведем на экран квадрат размером 300px на 300px:

Физические пиксели в Android

В одном случае квадрат по ширине будет занимать 40%, в другом — треть ширины, в третьем — 20%.

Теперь также возьмем квадрат со сторонами 300х300, но теперь вместо физических пикселей используем единицы dp:

независимые от плотности пиксели в Android

Теперь же размеры квадрата на разных устройствах выглядят более консистентно.

Для упрощения работы с размерами все размеры разбиты на несколько групп:

  • ldpi (low) : ~120dpi
  • mdpi (medium) : ~160dpi
  • hdpi (high) : ~240dpi (к данной группе можно отнести такое древнее устройство как Nexus One)
  • xhdpi (extra-high) : ~320dpi (Nexus 4)
  • xxhdpi (extra-extra-high) : ~480dpi (Nexus 5/5X, Samsung Galaxy S5)
  • xxxhdpi (extra-extra-extra-high) : ~640dpi (Nexus 6/6P, Samsung Galaxy S6)

Установка размеров

Основная проблема, связанная с размерами, связана с их установкой в коде Java. Например, некоторые методы принимают в качестве значения физические пиксели, а не device-independent pixels. В этом случае может потребоваться перевести значения из одного типа единиц в другой. Для этого требуется применить метод TypedValue.applyDimension() , который принимает три параметра:

public static float applyDimension(int unit, float value, android.util.DisplayMetrics metrics)

Параметр unit представляет тип единиц, из которой надо получить значение в пикселях. Тип единиц описывается одной из констант TypedValue :

  • COMPLEX_UNIT_DIP — dp или независимые от плотности экрана пиксели
  • COMPLEX_UNIT_IN — in или дюймы
  • COMPLEX_UNIT_MM — mm или миллиметры
  • COMPLEX_UNIT_PT — pt или точки
  • COMPLEX_UNIT_PX — px или физические пиксели
  • COMPLEX_UNIT_SP — sp или независимые от масштабирования пиксели (scale-independent pixels)

Параметр value представляет значение, которое надо преобразовать

Параметр metrics представляет информацию о метрике, в рамках коорой надо выполнить преобразование.

В итоге метод возвращает преобразованное значение. Рассмотрим абстрактный пример. Например, нам надо получить из 60dp обычные физические пиксели:

int valueInDp = 60; int valueInPx = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, valueInDp, getResources().getDisplayMetrics());

В качестве третьго аргумента передается вызов метода getResources().getDisplayMetrics() , который позволяет получить информацию о метрике, связанной с текущим устройством. В итоге мы получим из 60dp некоторое количество пикселей.

Источник

Как определить разрешение дисплея

Иногда приложению бывает необходимо узнать, какое разрешение дисплея сейчас установлено. Для чего это может понадобиться? Раньше, когда я не знал про метод setLocationRelativeTo, то использовал ниже представленный метод для позиционирования окна приложения. Я создавал специальный метод, который получал размеры экрана, потом размеры окна приложения, а затем рассчитывал координаты верхнего левого угла окна. Код примера с методом приведен ниже.

import java.awt.Dimension;
import java.awt.Toolkit;

public static void createGUI() JFrame.setDefaultLookAndFeelDecorated(true);
final JFrame frame = new JFrame(«Test frame»);

frame.setPreferredSize(new Dimension(300, 200));
setCenterPosition(frame);

private static void setCenterPosition(JFrame frame) Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getPreferredSize();

if (frameSize.height > screenSize.height) frameSize.height = screenSize.height;
>

if (frameSize.width > screenSize.width) frameSize.width = screenSize.width;
>

frame.setLocation((screenSize.width — frameSize.width) / 2,
(screenSize.height — frameSize.height) / 2);
>

public static void main(String[] args) javax.swing.SwingUtilities.invokeLater(new Runnable() public void run() createGUI();
>
>);
>
>

Из кода видно, что для получения размеров дисплея в пикселах необходимо у класса Toolkit вызывать статичный метод getDefaultToolkit, а затем метод getScreenSize, который вернет уже непосредственно размеры дисплея. Размеры возвратятся в виде экземпляра Dimension. Этот класс очень часто используется для хранения размеров.

Источник

Определение подходящего размера фрейма

Определение подходящего размера фрейма

Запомните, если размер не задан явно, все фреймы по умолчанию имеют размер 0x0 пикселей. Чтобы не усложнять наш пример, мы задали размеры фреймов так, чтобы окно нормально отображалось на большинстве мониторов. Однако в профессиональных приложениях сначала нужно проверить разрешающую способность экрана и написать код, изменяющий размер фрейма в соответствии с полученной величиной: окно, которое прекрасно смотрится на кране портативного компьютера, на экране дисплея с большой разрешающей способностью будет выглядеть как почтовая марка.

Для того чтобы определить размер экрана, надо выполнить следующие действия. Сначала следует вызвать статический метод getDefaultToolkit() класса Toolkit, который вернет объект Toolkit. (Класс Toolkit содержит много методов, предназначенных для взаимодействия с оконной системой конкретной платформы). Затем надо вызвать метод getScreenSize(), который вернет размер экрана в виде объекта Dimension. Объект Dimension содержит ширину и высоту в общедоступных(!) переменных width и height. Ниже представлен фрагмент кода, с помощью которого можно определить размер экрана.

Источник

Оцените статью