用Java保留屏幕边缘

如何创建一个窗口(如java.awt.Framejavax.swing.JFramejava.awt.Dialogjavax.swing.JDialog等)保留屏幕边缘,如dock,任务栏, Trillian,或Microsoft OneNote可以吗? 我的目标是尽可能只使用标准的JDK库。

此行为非常特定于Windows操作系统,因此无法在标准JDK或AWT / Swing中执行此操作,因为这些需要在多个不同的操作系统中一致地工作。

与您想要的最接近的是获取当前屏幕的边界并移动/调整窗口大小以适应一侧,尽管这将对桌面或其他窗口产生任何影响。

你可能得到的最接近的东西是使用JNIWrapper和WinPack来改变本机窗口的行为。 但是,他们的文档没有显示有关桌面工具栏的任何信息。 您可能必须使用他们的JNI直接访问特定的COM函数,然后了解如何在C ++中执行它,但如果您不了解C ++,那可能超出了您的项目范围。

附录:

如果要使用特定操作系统和桌面管理器的本机function,则需要连接本机 C ++库以挂接到Gnome,KDE,Mac OS等。搜索“Java JNI”和窗口系统想要集成以查找可以使用的包。 例如,对于Gnome,请参见此处 。

如果要支持多个操作系统,请确保创建公共接口,以便根据运行时可用的JNI进行连接,并在没有可用的情况下允许回退。

PS。 如果您想在应用程序中使用弹出通知,Mac OS和各种Linux版本支持Growl,这样可以节省您一些时间。

您可以使用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 (eg 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); }