如何正确输出java全屏

现在我在我的程序中做的是我正在使用setundecorated = truesetundecorated = true因此它使它全屏显示并且显示看起来非常好,但问题是左侧和右侧有图像(边框)我的屏幕和蓝色背景。 发生的变化是,在更改屏幕和分辨率时,这些会受到干扰并且无法正确显示。 那些灰色斑块再次出现

在此处输入图像描述

历史:

我有一个java程序,我想要全屏打开; 我无法找到正确的方法,因此我将最小值调整为(1370,727)和最大尺寸。 因此,它开始在我的笔记本电脑上正常打开,但当我将笔记本电脑的显示器更换为LCD时,它开始出现问题:

它在一个较小的窗口中打开: 登录窗口

如果我然后点击最大化按钮,侧面和底部会出现一个灰色区域(我希望屏幕上的项目能够拉伸或居中): 在此处输入图像描述

例如,底部有一个灰色的补丁。 相反,我希望背景覆盖整个屏幕。 在此处输入图像描述

更新1如果我更改为可伸缩的gridbaglayout,这是我使用的代码,会发生什么:

 Menu.setExtendedState(MAXIMIZED_BOTH); GridBagLayout gbl = new GridBagLayout(); Menu.setLayout(gbl); JButton component = new JButton("1"); gbl.layoutContainer(Menu); GridBagConstraints gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.NONE; gbl.setConstraints(component, gbc); Menu.add(component); Menu.pack(); Menu.setVisible(true); 

在此处输入图像描述

  1. 如何将“this”框架设置为setExtendedState(MAXIMIZED_BOTH),就像我对其他人一样? (如果我在main函数中执行此操作,则会出现错误;即使我为此创建函数并在main中调用它也会出现错误)

  2. 如何根据额外的灰色空间来拉伸/重新排列所有内容?

更新2此项目中的我的文件:

在此处输入图像描述

更新3这是我正在处理“FormTTS.java”的当前文件在那里搜索“MAXIMIZED_BOTH” ,你会发现我想你要检查的代码。

通常,就游戏而言,最好使用全屏模式而不是使用最大化窗口。 您可以使用以下方法在Java中执行此操作:

 GraphicsEnvironment gfxEnv = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gfxDev = gfxEnv.getDefaultScreenDevice(); Window window = new GameWindow(); gfxDev.setFullScreenWindow(window); 

如果您仍想使用常规框架并使内容面板居中,则需要定义一些GridBagLayout约束。 如果没有看到该屏幕上其他组件的代码,就不可能分辨出来,但请考虑以下因素:

  1. GridBagConstraints.fill
  2. GridBagConstraints.anchor
  3. GridBagConstraints.weightx
  4. GridBagConstraints.weighty

最后,关于将屏幕设置为最大尺寸,这里已经解决了: 根据屏幕分辨率的Java JFrame Size

我也有同样的要求,下面的代码对我有用。

 Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); setBounds(0,0,d.width,d.height); // i assume you have extended JFrame 

试试这个,希望它也适合你。

 MyFrame mFrame= new MyFrame(); mFrame.setVisible(true); mFrame.setExtendedState(mFrame.getExtendedState() | JFrame.MAXIMIZED_BOTH); 

我知道这是一个可怕的答案,因为我没有时间编写任何代码。 您是否尝试过创建一个侦听器,以便在实际创建窗口后获得正确的最大大小,然后相应地设置GridBagConstraints weightx和weighty属性?

你试过这段代码吗?

 JFrame frame = new JFrame(); frame.setSize(Toolkit.getDefaultToolkit().getScreenSize()); frame.setVisible(true); 

您可以通过java中的“Toolkit.getDefaultToolkit()。getScreenSize()”获取任何设备的全屏大小。 上面的代码我将帧大小设置为全屏。

 int height = Toolkit.getDefaultToolkit().getScreenSize().height; int width = Toolkit.getDefaultToolkit().getScreenSize().width; 

您可以使用上面的代码将屏幕的高度和宽度调整到您的代码中。 我认为这将是一个帮助。

你可以轻松打电话

setExtendedState(MAXIMIZED_BOTH); 在jframe或

使用波纹管代码将屏幕尺寸设置为任何PC。

//屏幕大小

  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

//任务栏的高度

 Insets scnMax = Toolkit.getDefaultToolkit().getScreenInsets(getGraphicsConfiguration()); int taskBarSize = scnMax.bottom; 

//可用的屏幕尺寸

  setSize(screenSize.width, screenSize.height - taskBarSize); setLocation(screenSize.width - getWidth(), screenSize.height - taskBarSize - getHeight()); 

如果你想要你可以删除任务栏大小以获得全屏,无论如何这是代码,这将帮助你。

尝试将图像设置为JFrame的背景。 因此它将根据帧大小进行调整

如何在GroupLayout Java中设置Jframe背景图像

所以即使是全屏也会调整..

如果您使用面板,那么您可以根据面板resize,它以完整的面板大小显示

 yourinternalframe.setSize(mainPanel.getSize()); yourinternalframe.show(); 

这可能不是你真正需要的,你可以根据这个做点什么

我看了你为FormTTS.java附加的代码,我发现你的屏幕被设置为使用硬编码到一些像素数的绝对布局。 看下面的代码:

Menu.getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

Menu.getContentPane().add(jPanel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(420, 230, 530, 320));

你的JFrame没有使用GridBagLayout,而是使用Netbeans库中的AbsoluteLayout。 所以我猜你用Netbeans的工具生成了这些UI代码。

然后关于最大化时未填满所有屏幕的图片: jLabel9.setIcon(new javax.swing.ImageIcon(getClass().getResource("/freetts/equations.png")));

Menu.getContentPane().add(jLabel9, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 1530, 990));

这里的问题相同,它被硬编码为一些像素数。

如果您希望在最大化屏幕时将所有内容都集中在一起,我认为唯一的方法是使用JFrame的gridbag布局,这需要您更新代码中的几乎所有内容。 您需要完全理解GridBagLayout的工作原理。 这是开始的地方。

但是,如果您只想让背景图像填满屏幕,您可以按照此处的步骤让图片缩放以填充JLabel的大小: 调整图片大小以适合JLabel

如果它仍然不起作用,您还应该获得屏幕的大小(来自此处的答案之一),然后使用这些值设置JLabel以及缩放图像。

要添加@ eitanfar的答案,在Java中启用全屏的最佳方法是使用FSEM(全屏独占模式)API 。


正如他所说,这是通过在GraphicsDevice上将窗口设置为全屏来实现的,您希望窗口全屏显示,通常是默认窗口。 即使您的设备不支持isFullscreenSupported() (id est isFullscreenSupported()返回false ),将窗口设置为全屏仍将部分工作,因为API将模拟全屏。 唯一的安全检查是validationGraphicsEnvironment是否无头( isHeadless() )。 如果是,则没有要显示的设备。


FSEM为您提供的优势是所有图形处理都在GPU上运行( GraphicsDevice是GPU,而不是显示器),因此在大多数系统上可以更快。 在程序的选项中,您可以允许用户选择是否启用FSEM,以便它们以最佳性能运行。


但是,在FSEM中系统的重绘事件是未定义的,您最好使用活动渲染 ,因此最好忽略重绘( setIgnoreRepaint(true) ),然后使用自定义线程进行绘制。

我的申请遇到了类似的问题。 我最接近的是将位于顶部的所有组件设置为component.setOpaque(false)或component.setBackground(new Color(255,255,255,0))。 你也可以为未使用的面板尝试panel.setVisible(false)。 很难提供整个程序的代码,但给这个旋转:

 Menu.setBackground(new Color(255,255,255,0);