Java GUI隐藏了Windows任务栏

时间:2011-07-22 13:20:53

标签: java swing user-interface

我使用JFrame为桌面应用程序创建GUI。我使用此代码根据平台屏幕的分辨率设置的GUI大小。

this.setSize(this.getToolkit().getScreenSize());

问题在于,当我运行应用程序时,GUI会覆盖所有屏幕。 Windows任务栏也隐藏在GUI后面。

我希望无论任务栏的大小如何,任务栏都应该在所有条件下都可见。我如何实现这一目标?

8 个答案:

答案 0 :(得分:6)

由于您使用的是JFrame,因此您应该调用:

jFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);

这会考虑任务栏的位置。

答案 1 :(得分:5)

您的任务栏是否设置为自动隐藏?

我刚刚在Windows 7计算机上运行了此测试代码。

import java.awt.Frame;
import javax.swing.*;

class TestFrameSize {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new JFrame("Test Screen Size");
                f.setAlwaysOnTop(true);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                System.out.println(f.getToolkit().getScreenSize());
                f.setExtendedState(Frame.MAXIMIZED_BOTH);
                f.setVisible(true);
                System.out.println(f.getSize());
            }
        });
    }
}

事实上,我跑了两次。这是输出:

任务栏配置为“自动隐藏”

java.awt.Dimension[width=1920,height=1080]
java.awt.Dimension[width=1928,height=1088]

(其中框架看起来比可用的屏幕空间高8个像素并且更宽 - 奇数。)

任务栏配置为“自动隐藏”

java.awt.Dimension[width=1920,height=1080]
java.awt.Dimension[width=1928,height=1048]

短40个像素,不再覆盖任务栏。

答案 2 :(得分:4)

您应该可以使用方法

找到TaskbarHeight

getTaskbarHeight();

来自

的减号
setFullScreen();

我在网上找到了这个例子

Setting screen size - taskBar

答案 3 :(得分:4)

我知道这是一个老问题,但是当我使用jFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);setState时,它会在第一次显示时正确显示。当我最小化它并再次最大化它时,它再次覆盖任务栏。我使用的是Windows 7和Java 1.7。

我找到了解决方案here

f.setExtendedState(JFrame.MAXIMIZED_BOTH);  
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();  
f.setMaximizedBounds(env.getMaximumWindowBounds());  
f.setVisible(true);  

这应该可以解决问题。

答案 4 :(得分:3)

也许您应该使用GraphicsDevice.setFullScreen Window()而不是setFullScreen()。 它将最大化窗口,而不是在“排序”非窗口模式下完全使用屏幕。

答案 5 :(得分:3)

比这一切要容易得多!任务栏存在于屏幕的插图中。因此,要获得您想要占用的空间,只需使用以下两个调用的结果:

Toolkit.getDefaultToolkit().getScreenInsets(f.getGraphicsConfiguration())

f.getGraphicsConfiguration().getBounds();

其中f是与任务栏在同一屏幕上的窗口。

不要使用Toolkit.getDefaultToolkit()。getScreenSize();因为它会给你第一个屏幕的大小,但不一定是你所在的屏幕。

时尝试使用下面的框架
  • 将窗口从一个屏幕移动到另一个屏幕
  • 将任务栏从每个屏幕的一个边缘拖到另一个边缘
  • 调整任务栏的大小
  • 制作任务栏自动隐藏
  • 调整屏幕分辨率。

每次按下按钮,它都会忠实地打印出您需要知道的有关任务栏位置的所有信息。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TaskBarExplorer {
    public static void main(String[] args) {
        final Frame f = new JFrame("F");
        JButton b = new JButton("do");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                print("current device");
                print(f.getGraphicsConfiguration());

                GraphicsDevice[] gds = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
                print("");
                print("all devices");
                for (GraphicsDevice gd : gds) {
                    print(gd.getDefaultConfiguration());
                }
                print("");
            }
        });
        f.add(b);
        f.setSize(100, 100);
        f.setLocation(600, 400);
        f.setVisible(true);
    }
    private static void print(GraphicsConfiguration gc) {
        print("insets: " + Toolkit.getDefaultToolkit().getScreenInsets(gc));
        print("bounds: " + gc.getBounds());
    }
    private static void print(String s) {
        System.out.println(s);
    }

}

懒惰的一些示例输出(这是来自一次执行,在不同调整后按下按钮):

current device
insets: java.awt.Insets[top=0,left=0,bottom=78,right=0]
bounds: java.awt.Rectangle[x=0,y=0,width=1280,height=1024]

all devices
insets: java.awt.Insets[top=0,left=0,bottom=78,right=0]
bounds: java.awt.Rectangle[x=0,y=0,width=1280,height=1024]
insets: java.awt.Insets[top=0,left=0,bottom=0,right=0]
bounds: java.awt.Rectangle[x=1280,y=0,width=800,height=600]

current device
insets: java.awt.Insets[top=0,left=0,bottom=0,right=0]
bounds: java.awt.Rectangle[x=1280,y=0,width=800,height=600]

all devices
insets: java.awt.Insets[top=0,left=0,bottom=78,right=0]
bounds: java.awt.Rectangle[x=0,y=0,width=1280,height=1024]
insets: java.awt.Insets[top=0,left=0,bottom=0,right=0]
bounds: java.awt.Rectangle[x=1280,y=0,width=800,height=600]

current device
insets: java.awt.Insets[top=0,left=0,bottom=0,right=58]
bounds: java.awt.Rectangle[x=1280,y=0,width=800,height=600]

all devices
insets: java.awt.Insets[top=0,left=0,bottom=0,right=0]
bounds: java.awt.Rectangle[x=0,y=0,width=1280,height=1024]
insets: java.awt.Insets[top=0,left=0,bottom=0,right=58]
bounds: java.awt.Rectangle[x=1280,y=0,width=800,height=600]

答案 6 :(得分:2)

怎么样?

jFrame.setState(JFrame.MAXIMIZED_BOTH);

答案 7 :(得分:0)

这是在Windows 10 / Java 8中对我有效的方法:

setExtendedState(Frame.MAXIMIZED_BOTH);
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();  
setSize(env.getMaximumWindowBounds().getSize());