用Java保留屏幕边缘

用Java保留屏幕边缘,java,swing,awt,Java,Swing,Awt,如何使窗口(如java.awt.Frame,javax.swing.JFrame,java.awt.Dialog,javax.swing.JDialog等)保留屏幕边缘,如dock、任务栏、Trillian或Microsoft OneNote可以?我的目标是尽可能只使用标准JDK库。您可以使用JMenu源代码中的Toolkit.getDefaultToolkit().getScreenInsets() Toolkit toolkit = Toolkit.getDefaultToolkit();

如何使窗口(如
java.awt.Frame
javax.swing.JFrame
java.awt.Dialog
javax.swing.JDialog
等)保留屏幕边缘,如dock、任务栏、Trillian或Microsoft OneNote可以?我的目标是尽可能只使用标准JDK库。

您可以使用JMenu源代码中的Toolkit.getDefaultToolkit().getScreenInsets()

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);
    }
Toolkit=Toolkit.getDefaultToolkit();
GraphicsConfiguration gc=getGraphicsConfiguration();
矩形screenBounds=新矩形(toolkit.getScreenSize());
图形环境=
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[]gd=ge.getScreenDevices();
对于(int i=0;i
此行为非常特定于Windows操作系统,因此在标准JDK或AWT/Swing中无法做到这一点,因为它们需要在多个不同的操作系统中一致地工作

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

最接近您想要的是通过使用来改变本机窗口行为。不过,他们的文档并没有显示任何关于桌面工具栏的内容。您可能需要使用JNI直接访问特定COM函数,然后在C++中找到如何完成它,但是如果您不知道C++,那可能超出了项目的范围。 增编:

如果您想利用特定操作系统和桌面管理器的本机特性,您需要连接本地C++库,以钩住GNOME、KDE、Mac OS等。搜索“java JNI”和要集成的窗口系统,以找到可以使用的包。例如,对于Gnome,请参见

如果您想支持多个操作系统,请确保创建一个公共接口,以便根据运行时哪个JNI可用而使实现与相应的JNI连接,如果没有可用的JNI,则允许回退


另外,如果你想在你的应用程序中弹出通知,Mac OS和各种Linux版本都支持咆哮,这样可以节省你一些时间。

你会
JSplitPane
吗?你的意思是你想创建一个窗口,让windows桌面上的工具栏这样的行为发生吗?@trashgood:
javax.swing.JSplitPane
不行;这是一个只在窗口内工作的组件。这是一个好问题。我还想找到如何做到这一点。不幸的是,我不知道。你可以使用默认的工具箱来获得分辨率,并创建一个未修饰、不可编辑、不可移动的框架。我不相信您可以“保留”屏幕空间,但是,听起来这对于java来说有点过于特定于显示管理器。此外,运行此方法似乎没有任何作用,它只是一段代码,说明如何在JMenu中获得插入。使用相同的方法。您可以在getScreenInsets()方法中获取默认工具箱并传递GraphicsConfiguration。你会得到插图并使用它们从屏幕边界中减去,Tat不会修改实际的屏幕边界,只是本地副本。我害怕u.u。为什么其他操作系统不能拥有所有Windows的功能首先,如果所有的操作系统都有相同的功能,消费者就别无选择。此外,我们需要记住,Java不仅是为PC设计的,而且还可以在手机、安全系统和其他嵌入式设备上运行,这些设备的显示能力可能非常有限,或者根本没有。Sun/Oracle无法编写本机代码来支持所有可能的硬件和软件配置。这就是你必须找到一个你想要的JNI,或者自己写一个。我猜你将不得不选择一个简单的解决方案-移动并调整你的应用程序窗口。等等。。。但是OSX可以为菜单栏保留顶部,为dock保留其他侧面,Gnome和Unity也可以这样做。。。为什么这个操作系统是特定的?是的,所有这些本机功能都是特定于各自的操作系统的。没有什么“为什么”,这就是事实。它们是完全不同的软件系统,由不同的人开发。我将扩大我的原始答案,因为这条评论太长了。谢谢。对于通知,我只需在通知区域中放置一个图标,并让它将通知推送到操作系统,而操作系统往往呈现为文本气球。