Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么jframe在最大化时隐藏任务栏?_Java_Swing_Jframe_Taskbar - Fatal编程技术网

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]),