Java 为什么jframe在最大化时隐藏任务栏?
我正在使用Java 为什么jframe在最大化时隐藏任务栏?,java,swing,jframe,taskbar,Java,Swing,Jframe,Taskbar,我正在使用setUndecorated(true)和getRootPane().setWindowDecorationStyle(JRootPane.FRAME)在我的jFrame中。这很好,但现在当我最大化我的框架时,它遍布整个窗口,甚至任务栏都不可见。如何使框架不隐藏任务栏 此外,当我多次最大化或最小化我的帧时,光标将更改为此,当光标位于帧的边框上时,通常使用此更改帧的大小。有什么我能做的吗 然后,一个小的代码就可以复制这个东西: import javax.swing.JFrame; im
setUndecorated(true)代码>和getRootPane().setWindowDecorationStyle(JRootPane.FRAME)代码>在我的jFrame中。这很好,但现在当我最大化我的框架时,它遍布整个窗口,甚至任务栏都不可见。如何使框架不隐藏任务栏
此外,当我多次最大化或最小化我的帧时,光标将更改为此
,当光标位于帧的边框上时,通常使用此更改帧的大小。有什么我能做的吗
然后,一个小的代码就可以复制这个东西:
import javax.swing.JFrame;
import javax.swing.JRootPane;
public class Demo extends JFrame {
public Demo() {
setSize(250,125);
setUndecorated(true);
getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
setVisible(true);
}
public static void main(String[] args) {
new Demo();
}
}
也许您可以设置jFrame的最大大小,并根据屏幕大小进行限制
编辑
还可以查看也许您可以设置jFrame的最大大小,并根据屏幕大小进行限制
编辑
另请查看这是一个已知的错误:
引用此链接:
解决方法是将JFrame和
重写setExtendedState方法,
在之前捕获任何事件
它们会发生并设置最大值
框架的边界
在调用超类的
setExtendedState方法
这是一个已知的错误:
引用此链接:
解决方法是将JFrame和
重写setExtendedState方法,
在之前捕获任何事件
它们会发生并设置最大值
框架的边界
在调用超类的
setExtendedState方法
Fortega答案有效,但有些部分不需要(或Java 8不再需要):
- 不需要保存
矩形
- 该代码不考虑双屏幕配置。特别是,如果窗口更改屏幕,
图形配置
将更改
- 就我测试而言,唯一需要的覆盖是
setExtendedState
当分解双屏配置时,至少在Windows上,以下代码无法正常工作:
Rectangle maxBounds = new Rectangle(screenInsets.left + screenSize.x,
screenInsets.top + screenSize.y,
screenSize.x + screenSize.width - screenInsets.right - screenInsets.left,
screenSize.y + screenSize.height - screenInsets.bottom - screenInsets.top);
在以下双屏幕设置中:
- 左屏幕1920x1080(非主屏幕),位置:-1920,0
- 右屏幕1920x1080(主),位置:0,0
maxBounds
将包含负x(-1920),但setMaximizedBounds
不知何故希望屏幕空间中有一个坐标(其中(x,y)
从(0,0)
开始),而不是虚拟屏幕:
- 它将设置为
setMaximizedBounds(x=-1920,y=0,宽度=1920,高度=1050)
- Windows将在左屏幕上看到窗口(因为我在每个屏幕上都有一个任务栏,只显示该屏幕上的窗口),但是窗口不会显示在屏幕上,因为它是禁止进入的
- 如果屏幕的分辨率,或者更糟的是,其比例因子(对于笔记本电脑,Windows 10将应用比例因子,例如:25%,使屏幕“不是这样”1920x1080),则上述代码不适用。例如,如果我的配置有3个屏幕,最右边是主屏幕,则窗口将在左侧和中间屏幕上显示不好。我不认为我在下面的代码中修复了这个问题
以下代码在Windows上工作,具有双屏:
@Override
public synchronized void setExtendedState(final int state) {
if ((state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) {
final GraphicsConfiguration cfg = getGraphicsConfiguration();
final Insets screenInsets = getToolkit().getScreenInsets(cfg);
final Rectangle screenBounds = cfg.getBounds();
final int x = screenInsets.left + screenBounds.x * 0;
final int y = screenInsets.top + screenBounds.y * 0;
final int w = screenBounds.width - screenInsets.right - screenInsets.left;
final int h = screenBounds.height - screenInsets.bottom - screenInsets.top;
final Rectangle maximizedBounds = new Rectangle(x, y, w, h);
System.out.println("cfg (" + cfg + ") screen.{bounds: " + screenBounds + ", insets: " + screenInsets + ", maxBounds: " + maximizedBounds);
super.setMaximizedBounds(maximizedBounds);
}
super.setExtendedState(state);
}
在一个简单的JFrame
:
- 在左侧屏幕上最大化(“屏幕=0”)将打印
cfg(D3DGraphicsConfig[dev=D3DGraphicsDevice[screen=0],pixfmt=0])屏幕。{bounds:java.awt.Rectangle[x=-1920,y=0,width=1920,height=1080],insets:java.awt.insets[top=0,left=0,bottom=30,right=0],maxBounds:java.awt.Rectangle[x=0,y=0,width=1920,height=1050]
- 在右屏幕上最大化(“屏幕=1”)将打印
cfg(D3DGraphicsConfig[dev=D3DGraphicsDevice[screen=1],pixfmt=0])屏幕。{bounds:java.awt.Rectangle[x=0,y=0,width=1920,height=1080],insets:java.awt.insets[top=0,left=0,bottomer=30,right=0],maxBounds:java.awt.Rectangle[x=0,y=0,width=1920,height=1050]
Fortega答案有效,但某些部分不需要(或Java 8不再需要):
- 不需要保存
矩形
- 该代码不考虑双屏幕配置。特别是,如果窗口更改屏幕,
图形配置
将更改
- 就我测试而言,唯一需要的覆盖是
setExtendedState
当分解双屏配置时,至少在Windows上,以下代码无法正常工作:
Rectangle maxBounds = new Rectangle(screenInsets.left + screenSize.x,
screenInsets.top + screenSize.y,
screenSize.x + screenSize.width - screenInsets.right - screenInsets.left,
screenSize.y + screenSize.height - screenInsets.bottom - screenInsets.top);
在以下双屏幕设置中:
- 左屏幕1920x1080(非主屏幕),位置:-1920,0
- 右屏幕1920x1080(主),位置:0,0
maxBounds
将包含负x(-1920),但setMaximizedBounds
不知何故希望屏幕空间中有一个坐标(其中(x,y)
从(0,0)
开始),而不是虚拟屏幕:
- 它将设置为
setMaximizedBounds(x=-1920,y=0,宽度=1920,高度=1050)
- Windows将在左屏幕上看到窗口(因为我在每个屏幕上都有一个任务栏,只显示该屏幕上的窗口),但是窗口不会显示在屏幕上,因为它是禁止进入的
- 如果屏幕的分辨率,或者更糟,其比例因子(对于笔记本电脑,Windows 10将应用比例因子,例如:25%,使屏幕“不是这样”1920x1080),则上面的代码不适用。例如,如果我的配置有3个屏幕,最右边是主屏幕,则窗口将在左侧和中间屏幕上显示不好。我认为我没有在下面的代码中修复此问题
以下代码在Windows上工作,具有双屏:
@Override
public synchronized void setExtendedState(final int state) {
if ((state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) {
final GraphicsConfiguration cfg = getGraphicsConfiguration();
final Insets screenInsets = getToolkit().getScreenInsets(cfg);
final Rectangle screenBounds = cfg.getBounds();
final int x = screenInsets.left + screenBounds.x * 0;
final int y = screenInsets.top + screenBounds.y * 0;
final int w = screenBounds.width - screenInsets.right - screenInsets.left;
final int h = screenBounds.height - screenInsets.bottom - screenInsets.top;
final Rectangle maximizedBounds = new Rectangle(x, y, w, h);
System.out.println("cfg (" + cfg + ") screen.{bounds: " + screenBounds + ", insets: " + screenInsets + ", maxBounds: " + maximizedBounds);
super.setMaximizedBounds(maximizedBounds);
}
super.setExtendedState(state);
}
在一个简单的JFrame
:
- 在左侧屏幕上最大化(“屏幕=0”)将在屏幕上打印
cfg(D3DGraphicsConfig[dev=D3DGraphicsDevice[screen=0],pixfmt=0]),