如何制作一个窗口(例如java.awt.Frame
,javax.swing.JFrame
,java.awt.Dialog
,javax.swing.JDialog
等)保留屏幕边缘,如停靠,任务栏,Trillian或Microsoft OneNote可以吗?我的目标是尽可能只使用标准的JDK库。
答案 0 :(得分:2)
您可以使用Toolkit.getDefaultToolkit()。getScreenInsets()来自JMenu来源
Toolkit toolkit = Toolkit.getDefaultToolkit();
GraphicsConfiguration gc = getGraphicsConfiguration();
Rectangle screenBounds = new Rectangle(toolkit.getScreenSize());
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gd = ge.getScreenDevices();
for(int i = 0; i < gd.length; i++) {
if(gd[i].getType() == GraphicsDevice.TYPE_RASTER_SCREEN) {
GraphicsConfiguration dgc =
gd[i].getDefaultConfiguration();
if(dgc.getBounds().contains(position)) {
gc = dgc;
break;
}
}
}
if (gc != null) {
screenBounds = gc.getBounds();
// take screen insets (e.g. taskbar) into account
Insets screenInsets = toolkit.getScreenInsets(gc);
screenBounds.width -=
Math.abs(screenInsets.left + screenInsets.right);
screenBounds.height -=
Math.abs(screenInsets.top + screenInsets.bottom);
position.x -= Math.abs(screenInsets.left);
position.y -= Math.abs(screenInsets.top);
}
答案 1 :(得分:2)
此行为非常特定于Windows操作系统,因此无法在标准JDK或AWT / Swing中执行此操作,因为这些需要在多个不同的操作系统中一致地工作。
与您想要的最接近的是获取当前屏幕的边界并移动/调整窗口大小以适应一侧,尽管这将对桌面或其他窗口产生任何影响。
你最接近你想要的是使用JNIWrapper and WinPack来改变本机窗口的行为。但是,他们的文档没有显示有关桌面工具栏的任何信息。您可能必须使用他们的JNI直接访问特定的COM函数,然后了解如何在C ++中执行它,但如果您不了解C ++,那可能超出了您的项目范围。
附录:
如果要使用特定操作系统和桌面管理器的本机功能,则需要连接本机 C ++库以挂接到Gnome,KDE,Mac OS等。对于“Java JNI”和要集成的窗口系统,以查找可以使用的包。例如,对于Gnome,请参阅here。
如果要支持多个操作系统,请确保创建公共接口,以便根据运行时可用的JNI进行连接,并在没有可用的情况下允许回退。< / p>
PS。如果你想在你的应用程序中使用弹出通知,Mac OS和各种Linux版本都支持Growl,这样可以节省一些时间。