我使用JFrame
为桌面应用程序创建GUI。我使用此代码根据平台屏幕的分辨率设置的GUI大小。
this.setSize(this.getToolkit().getScreenSize());
问题在于,当我运行应用程序时,GUI会覆盖所有屏幕。 Windows任务栏也隐藏在GUI后面。
我希望无论任务栏的大小如何,任务栏都应该在所有条件下都可见。我如何实现这一目标?
答案 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();
我在网上找到了这个例子
答案 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());