В следующем подходе используется только API JavaFX.
Я протестировал его с Win 10 и java 8 update 161. Он работает, но не запускается, когда панель задач может скрывать динамически отображаемый экран (всегдасчитает, что границы в этом случае равны визуальным границам.)
Поскольку обновление списка осуществляется с помощью не публичного Toolkit
API, оно может работать некорректно для другой ОС.
ObservableList<Screen>
, возвращаемое Screen.getScreens()
, изменяется при изменении (визуальных) границ Screen
.Этот факт можно использовать для определения стороны панели задач на основном экране на основе разницы между bounds
и visualBounds
:
InvalidationListener listener = new InvalidationListener() {
private Side currentSide = null;
public void invalidated(Observable o) {
Screen primary = Screen.getPrimary();
Rectangle2D bounds = primary.getBounds();
Rectangle2D visualBounds = primary.getVisualBounds();
Side side = null;
// determine side of task bar, if size differs
if (bounds.getWidth() > visualBounds.getWidth()) {
if (bounds.getMinX() < visualBounds.getMinX()) {
side = Side.LEFT;
} else if (bounds.getMaxX() > visualBounds.getMaxX()) {
side = Side.RIGHT;
}
} else if (bounds.getHeight() > visualBounds.getHeight()) {
if (bounds.getMinY() < visualBounds.getMinY()) {
side = Side.TOP;
} else if (bounds.getMaxY() > visualBounds.getMaxY()) {
side = Side.BOTTOM;
}
}
// only notify once per change independent of size of task bar
if (side != currentSide) {
currentSide = side;
System.out.println(side == null
? "Side of task bar unknown/task bar not displayed"
: "The task bar is now displayed in the " + side);
}
}
};
Screen.getScreens().addListener(listener);
listener.invalidated(null);