Получение каждой вставки монитора в Java
Не возражайте против использования оконных вставок, но уделите больше внимания использованию ScreenInsets, который сохраняется локально как вставки вставок; Я печатаю insets.bottom, и для каждого монитора отображается высота панели задач, хотя панель задач расположена только на первом мониторе.
Вставки монитора на моем втором мониторе должны быть все равны нулю, но все же он действует так, как будто панель задач расположена на обоих мониторах. При установке окна в полноэкранном режиме на мониторе окно в настоящее время находится в рабочем состоянии, за исключением того, что оно оставляет место для панели задач независимо от того, в каком мониторе оно используется.
Исходя из моего понимания Toolkit.getScreenInsets(GraphicsConfiguration), он должен возвращать правильные вставки для конкретной передаваемой вами GraphicsConfiguration, но я передаю в GraphicsConfiguration каждого GraphicsDevice и получаю те же результаты обратно.
JFrame window;
public void setSizeToFullScreen()
{
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] screenDevices=ge.getScreenDevices();
Point p=window.getLocationOnScreen();
for(int i=0;i<screenDevices.length;i++)
{
Rectangle2D b=screenDevices[i].getDefaultConfiguration().getBounds();
if(SMath.getMath().doesRectangleContainPoint(b.getX(), b.getY(), b.getWidth(), b.getHeight(), p.getX(),p.getY()))
{
Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(screenDevices[i].getDefaultConfiguration());
System.out.println("Monitor: "+i+": task bar height: "+insets.bottom);
this.setSize(b.getWidth()+1 -(insets.right+insets.left)-(this.window.getInsets().left+this.window.getInsets().right), b.getHeight()+1-(insets.top+insets.bottom)-(this.window.getInsets().top+this.window.getInsets().bottom));
this.setLocation(b.getX()+insets.left+window.getInsets().left, b.getY()+insets.top+window.getInsets().top);
return;
}
}
}
Мой вопрос в Java, как мы можем выяснить, какой монитор на самом деле имеет панель задач, или лучший вопрос, как мы можем получить правильные вставки монитора для каждого монитора в Java.
1 ответ
Re: "..., все же он действует так, как будто панель задач расположена на обоих мониторах".
Я нашел следующее:
Ссылаясь на Windows-> Панель управления-> Внешний вид и персонализация-> Дисплей-> Разрешение экрана:
Когда gs[0] (= отображение, показанное с помощью "1" внутри круга в окне панели управления выше) имеет панель инструментов, указанные вложения являются правильными.
Т.е. сообщается, что они равны = 0 для экрана без панели инструментов и = 49 для экрана с панелью инструментов.
Когда у любого другого gs[x] есть панель инструментов, сообщаемые вкладки неверны:-(. Т.е. они сообщаются как = 49 для всех экранов.
В моем приложении я хочу, чтобы "JDialog dialog0" всегда отображался на расстоянии 500 справа от нижнего левого угла моего "большого" дисплея, а "JFrame frameBalloonHerderGui" всегда появлялся в верхнем левом углу моего "маленького" дисплея,
Я хочу, чтобы JDialog имел фиксированный размер в левом нижнем углу моего "большого" дисплея, и JFrame должен в значительной степени заполнять "маленький" дисплей, в котором он находится.
Я дал графическую конфигурацию для отображения, которую я хотел, чтобы каждый JDialog/JFrame отображался в своих конструкторах. Увы, этого недостаточно, чтобы вставки были правильными.
Чтобы выполнить позиционирование выше, я написал функцию, которую я вызываю для JDialog и JFrame, следующим образом:
// I'll omit the creation of the grapicsConfiguration for now.
JDialog dialog0 = new JDialog( gc);
ScreenAndTaskBarHeights h = getThisComponentsScreensTaskBarHeight( dialog0);
final int myWidth = 1170;
final int myHeight = 800;
final int myScreenXInset = 500;
final int myScreenYInset = 10;
dialog0.setBounds(
h.screenOriginX + myScreenXInset,
h.screenOriginY + h.screenHeight - myHeight - h.taskBarHeight - myScreenYInset,
myWidth, myHeight);
dialog0.setVisible( true);
// I'll omit the creation of the grapicsConfiguration for now.
JFrame frameBalloonHerderGui = new JFrame( gc);
ScreenAndTaskBarHeights h =
getThisComponentsScreensTaskBarHeight( frameBalloonHerderGui);
final int myWidth = 1695;
final int myScreenInset = 10;
frameBalloonHerderGui.setBounds(
h.screenOriginX + myScreenInset,
h.screenOriginY + myScreenInset,
myWidth, h.screenHeight - (myScreenInset * 2) - h.taskBarHeight);
frameBalloonHerderGui.setVisible( true);
Обходной путь, который я нашел, состоит в том, что screenSize.x & .y = (0,0) для дисплея, который имеет панель задач, и некоторые большие положительные или отрицательные числа для других дисплеев.
Функция ниже успешно реализует этот обходной путь. Я также сделал простой класс, чтобы я мог передать несколько значений вызывающей стороне, как показано выше.
// Add additional data members here to your liking.
static class ScreenAndTaskBarHeights
{
int screenOriginX = -1;
int screenOriginY = -1;
int screenHeight = -1;
int taskBarHeight = -1;
ScreenAndTaskBarHeights()
{
}
void setValues(
int newScreenOriginX, int newScreenOriginY,
int newScreenHeight, int newTaskBarHeight)
{
screenOriginX = newScreenOriginX;
screenOriginY = newScreenOriginY;
screenHeight = newScreenHeight;
taskBarHeight = newTaskBarHeight;
}
}
static ScreenAndTaskBarHeights
getThisComponentsScreensTaskBarHeight( Component c)
{
ScreenAndTaskBarHeights screenAndTaskBarHeights =
new ScreenAndTaskBarHeights();
GraphicsConfiguration gc = c.getGraphicsConfiguration();
Insets scnMax = Toolkit.getDefaultToolkit().getScreenInsets( gc);
// This should be the TaskBar height specific to the gc that we
// passed in, but it's not :-(.
//
// int taskBarHeight = scnMax.bottom;
//
// However, this seems to be a successful workaround:
//
Rectangle screenSize = gc.getBounds();
boolean thisScreenHasTheToolbar =
(screenSize.x == 0 && screenSize.y == 0);
// Change scnMax.bottom to catch wherever you're worried that the
// TaskBar may be lurking.
//
screenAndTaskBarHeights.setValues(
screenSize.x, screenSize.y, screenSize.height,
(thisScreenHasTheToolbar) ? scnMax.bottom : 0);
return screenAndTaskBarHeights;
}