我想知道我的javafx项目的任务栏位置。意思是我想知道任务栏是在顶部,底部,左边还是右边。当任务栏位置发生变化时,我想在代码中执行一些操作。我怎么做这些事?
发布于 2018-06-07 05:42:28
您可以使用java.awt.Toolkit
获得给定屏幕设备的屏幕信息。
对于主屏幕:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice defaultScreenDevice = ge.getDefaultScreenDevice();
GraphicsConfiguration defaultConfiguration = defaultScreenDevice.getDefaultConfiguration();
Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(defaultConfiguration);
用于主屏幕的嵌入(使用Windows 10):
java.awt.Insetstop=0,left=0,bottom=40,right=0
因此,任务栏高度为40像素,位于屏幕底部。
发布于 2018-06-07 05:36:35
以下方法仅使用JavaFX API。
我用Win 10 & java 8更新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);
https://stackoverflow.com/questions/50741928
复制