如何正确地输出Java全屏幕

12
现在我程序中正在使用setundecorated = trueMAXIMIZED_BOTH让它全屏,并且显示效果很好,但问题是屏幕左右两侧有图像边框和蓝色背景。在切换屏幕和分辨率时,这些会受到干扰并且不能正确显示,灰色斑块会再次出现。
历史:
我有一个Java程序,我希望在全屏状态下始终打开;我无法找到合适的方法,因此我调整了最小值为(1370, 727)以及最大尺寸。因此,在我的笔记本电脑上开始正常打开,但当我将笔记本电脑的显示器更改为LCD时,它开始出现问题:
它以较小的窗口打开: Login Window 如果我然后点击最大化按钮,会在侧面和底部出现灰色区域(我希望屏幕上的项目被拉伸或居中): enter image description here 例如,这里底部有一个灰色补丁。相反,我希望背景覆盖整个屏幕。 更新1 如果我改为可拉伸的网格包布局,则使用的代码及其发生的情况如下:
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);

enter image description here

问题

  1. 如何将“this”帧设置为setExtendedState(MAXIMIZED_BOTH),就像我对其他帧所做的那样?(如果我在主函数中这样做,就会出现错误;即使我为此编写一个函数并在主函数中调用它,我也会遇到错误)

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

更新2 我在该项目中的文件:

enter image description here

更新3 我正在处理的当前文件"FormTTS.java" 在其中搜索“MAXIMIZED_BOTH”,您将找到我认为您想要检查的代码。


@MartinAndersson,您能否为我详细解释一下,您的意思是什么?我需要重新制作整个程序吗?抱歉,我可能没有完全理解您的意思,可能是因为我是新手,抱歉 :P - Daksh Shah
我不想把这个作为答案,因为我不确定它是否能帮助到你,但是调用 frame.setUndecorated(true) 将会移除顶部框架边框(标题所在的位置)和侧边框,将其余空间填充为面板内的任何内容(如果您的面板意图填满屏幕)。 - Dioxin
@VinceEmigh 我会试着只放一次。 - Daksh Shah
@MartinAndersson 谢谢,我以后会更多地了解Javafx,因为问题是我想尽快完成项目,所以现在不能再做一遍:P - Daksh Shah
1
我曾经使用Swing来开发GUI(仅限个人使用,没有专业用途)。最近我在做的事情是,我意识到它将会是多么痛苦,于是开始使用JavaFX,但后来意识到,为什么要使用JavaFX呢?我可以直接使用CSS和Javascript(例如JQuery)。老实说,我开始认为WebApp可能是部署的最佳方法(而且使用Java作为后端并不复杂),前端与Java通信也不复杂(例如servlets和JSPs),而且非常便携(用户只需要浏览器)——这只是我的个人看法。 - Jared
显示剩余8条评论
11个回答

3
通常情况下,对于游戏来说,使用全屏模式而不是最大化窗口更佳。您可以通过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 according to screen resolution

对我来说,它是最大化或全屏都无所谓,唯一的问题是灰色补丁不应该出现...一切都应该最大化或根据全屏进行调整。 - Daksh Shah
这与您定义的GridBagLayout约束有关。如果您可以发布更多代码(特别是构建UI组件和容器的代码),那么帮助您可能会更容易些。 - ethanfar
请问您能否检查一下我拥有的文件,并告诉我您需要上传哪些文件?我将在我的项目中放置这些文件的片段。 - Daksh Shah
从文件名很难理解。我会说在“更新1”块中引用代码的文件。需要的是创建框架和其中面板的代码。 - ethanfar
乍一看,问题似乎可能是您将框架内容窗格的布局设置为null,这意味着没有布局管理器来处理组件位置和大小的调整。 - ethanfar
显示剩余3条评论

2
我也有与您相同的需求,下面的代码对我有效。
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(0,0,d.width,d.height); // i assume you have extended JFrame

尝试将图像设置为 JFrame 背景,这样它就会随着框架大小调整。 - sampopes

0

你试过这段代码吗

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;

你可以使用上述代码在你的程序中获取屏幕的高度和宽度。我认为这会对你有所帮助。


你的代码是否能使所有元素全屏显示?我的意思是说,这段代码是否仍会产生灰色补丁? - Daksh Shah
如果您可以通过setwidth()和setheight()方法更改元素大小,则可以将这些宽度和高度值分配给它。然后,它将在没有灰色补丁的情况下显示您的软件全屏。 - codethilina
我不能为每一个字段都设置,因为它们太多了。我希望有一种可以为所有这些字段设置的方法...如果我误解了,请原谅:P - Daksh Shah
如果您将元素加载到JPanel中,只需将JPanel大小更改为上述大小即可。我认为它会根据您的需求工作。 - codethilina
抱歉,我没有更多的想法了。 - codethilina

0
你可以轻松地调用以下代码:

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());

如果你想的话,可以移除任务栏大小以获得全屏,以下是代码,这将对你有所帮助。


@HarsMadushan 问题在于我知道如何通过最大化来设置它,但这会导致出现灰色补丁,我希望一切都能调整位置或伸展。 - Daksh Shah

0

如果您使用面板,则可以根据面板调整大小,它将显示为完整的面板大小。

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

这可能不是您真正需要的,您可以根据此做一些事情


0
补充一下 @eitanfar 的回答,启用 Java 全屏的最佳方法是使用 FSEM(全屏独占模式)API。
正如他所说,这可以通过将窗口设置为全屏显示在GraphicsDevice上实现,通常是默认的那个。即使您的设备不支持FSEM(即isFullscreenSupported()返回false),将窗口设置为全屏仍然部分工作,因为API将模拟全屏。唯一的安全检查是验证GraphicsEnvironment是否为无头(isHeadless())。如果是,则没有设备可供显示。
FSEM的优势在于所有图形处理都在GPU上运行(GraphicsDevice是GPU,而不是显示器),因此在大多数系统上速度更快。在程序选项中,您可以允许用户选择启用或禁用FSEM,以便他们可以以最佳性能运行。
然而,在全屏独占模式下,系统的重绘事件是未定义的,您最好使用主动渲染,因此最好忽略重绘(setIgnoreRepaint(true)),然后使用自定义线程进行绘制。

0
我知道这个回答很差,因为我没有时间写任何代码。你试过创建一个监听器,所以一旦窗口实际创建,你可以获取正确的最大尺寸,然后相应地设置GridBagConstraints的weightx和weighty属性吗?

嘿,我是Java编程的新手,我几乎所有的东西都是从Netbeans GUI中制作的。所以我不太知道如何编写所有这些代码,能否解释一下? - Daksh Shah

0

0
我看了一下你附加的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));
同样的问题,它被硬编码到一些像素数上。

如果你想让所有东西在你最大化屏幕时都居中,我认为唯一的方法是使用GridBagLayout来设置你的JFrame,这需要你更新代码中的几乎所有内容。而且你需要完全理解GridBagLayout的工作原理。这里是开始的地方。

然而,如果你只想让背景图片填满屏幕,你可以按照这里的步骤让图片缩放以适应JLabel的大小: 调整图片大小以适应JLabel

如果仍然不起作用,你还应该从这里的一个答案中获取屏幕的大小,然后将JLabelprefferedSize设置为这些值,除了缩放图像。


0

试试这个,希望它对你也有用。

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

仍然存在灰色补丁 - Daksh Shah
请查看此链接,您可以编程方式获取屏幕分辨率并以动态方式提供,而不是静态方式。https://dev59.com/y3A65IYBdhLWcg3wsg2B - ajitksharma
阅读了那个。仍然有问题。 - Daksh Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接