用Java保留屏幕边缘

时间:2011-01-11 16:43:55

标签: java swing awt

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

2 个答案:

答案 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,这样可以节省一些时间。