【问题标题】:How to output java full screen properly如何正确输出java全屏
【发布时间】:2014-03-08 23:20:47
【问题描述】:

现在我在我的程序中正在做的是我正在使用setundecorated = trueMAXIMIZED_BOTH 所以它让它全屏显示并且显示看起来非常好,但问题是有图像(边框)在我屏幕的左侧和右侧以及蓝色背景。发生的情况是,在更改屏幕和分辨率时,这些会受到干扰并且无法正确显示。那些灰色的补丁又出现了

历史:

我有一个想要全屏打开的 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. 我如何将“这个”框架设置为 setExtendedState(MAXIMIZED_BOTH),就像我对其他人所做的那样? (如果我在 main 函数中这样做,我会得到一个错误;即使我为此创建一个函数并在 main 中调用它,我也会得到一个错误)

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

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

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

【问题讨论】:

  • 我知道这不是答案,因此我将其作为评论。但是您是否考虑过使用 JavaFX 代替?它是块上新的 GUI 小子,它既易于开发,又易于观察。使 JavaFX 中的应用程序全屏显示是 kids play。 Oracle 早就说过他们放弃了 Swing 的开发,转而使用 JavaFX。你绝对应该考虑换一个。
  • @MartinAndersson 您能否为我详细说明一下,您的意思是什么?我必须重新制作整个程序吗?对不起,我没有完全理解你,也许因为我是新手对不起:P
  • 我不想把这个作为答案,因为我不确定它是否会对你的情况有所帮助,但调用 frame.setUndecorated(true) 将删除顶部框架边框(标题所在的位置)和侧边框,用其中的任何内容填充其余空间(如果您的面板旨在填充屏幕)
  • @VinceEmigh 我会试着放一次。
  • 我曾经使用 Swing 来开发 GUI(没什么专业的,只是为了我自己)。我正在做的最新一件事是,我意识到这将是多么痛苦,并开始使用 JavaFX,但后来意识到,当我只能使用 CSS 和 Javascript(比如 JQuery)时,为什么还要使用它。老实说,我开始认为 WebApp 可能是最好的部署方法(后端使用 Java 并不复杂),前端与 Java(即 servlet 和 JSP)对话也不复杂,而且它非常便携(用户只需要一个浏览器)——只要我的两分钱。

标签: java swing user-interface awt fullscreen


【解决方案1】:

通常,就游戏而言,最好使用全屏模式而不是最大化窗口。你可以在 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

【讨论】:

  • 对我来说,无论是最大化还是全屏都无所谓,唯一的问题是灰色补丁不应该出现......一切都应该根据全屏最大化或调整
  • 这与您定义的 GridBagLayout 约束有关。如果您可以发布更多代码(特别是构建 UI 组件和容器的代码),可能会更容易为您提供帮助。
  • 能否请您从我拥有的文件中查看并告诉我您要我上传哪些文件,我将把文件的片段放在我的项目中
  • 从文件名上很难理解。我会说你在“Updae 1”块中引用的代码的文件。我们需要的是创建框架的代码,以及其中的面板。
  • 乍一看,问题可能在于您将框架的内容窗格的布局设置为空,这意味着没有布局管理器来处理调整大小时的组件位置和大小。
【解决方案2】:

我也有和你一样的要求,下面的代码对我有用。

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

【讨论】:

  • 尝试将图像设置为 JFrame 的背景。所以它会随着帧大小调整..
【解决方案3】:

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

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

【讨论】:

【解决方案4】:

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

【讨论】:

  • 嘿,我是 Java 编程新手,我几乎从 Netbeans GUI 制作所有东西。所以我不太了解如何编写所有这些代码,需要解释一下吗?
【解决方案5】:

你试过这个代码吗

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;

您可以使用上述代码为您的代码获取屏幕的高度和宽度。我认为这会有所帮助。

【讨论】:

  • 您的代码是否使所有元素全屏显示?我的意思是这段代码还会产生灰色补丁吗?
  • 如果您可以通过 setwidth() 和 setheight() 方法更改元素大小,那么您可以为其分配宽度和高度值。然后它将全屏显示您的软件,没有灰色补丁。
  • 我不能为他们每一个,我有太多的领域。我想要一些可以为所有这一切设置的东西......对不起,如果我误解了它:P
  • 如果您将元素加载到 jpanel 中,只需简单地将 jpanel 大小更改为与上面相同。我认为它会根据您的需要起作用。
  • 对不起,我没有更多的想法。
【解决方案6】:

您可以轻松调用

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 问题是我知道如何通过最大化两者来设置它,但这会导致灰色斑块出现,我希望一切都调整位置或拉伸
【解决方案7】:

尝试将图像设置为 JFrame 的背景。所以它会随着帧大小调整

How to set Jframe Background Image in GroupLayout Java

所以即使在全屏下它也会调整..

【讨论】:

    【解决方案8】:

    如果你使用面板,那么你可以根据面板调整大小,它显示为全面板大小

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

    这似乎不是你真正的需要,你可以根据这个做一些事情

    【讨论】:

      【解决方案9】:

      我查看了您为 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 的工作原理。 Here is the place to start.

      但是,如果您只希望背景图像填满屏幕,您可以按照此处的步骤让图片缩放以填充 JLabel 的大小: Resize a picture to fit a JLabel

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

      【讨论】:

        【解决方案10】:

        补充@eitanfar 的答案,在Java is using the FSEM (FullScreen Exclusive Mode) API 中启用全屏的最佳方式。


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


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


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

        【讨论】:

          【解决方案11】:

          我的应用程序也有类似的问题。我最近的方法是将位于顶部的所有组件设置为 component.setOpaque(false) 或 component.setBackground(new Color(255,255,255,0))。您也可以为未使用的面板尝试 panel.setVisible(false) 。 在没有整个程序的情况下很难提供代码,但试一试:

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

          【讨论】:

          • setvisible false 如何解决我的问题?能不能详细解释一下?
          • 与您必须将 JFrame 设置为 setVisible(true) 以查看可以应用于面板和其他组件的框架非常相似。如果您将周围未使用的面板设置为 setVisible(false) 它应该增加您的中心面板的面积。如果不是这种情况,那么您的图片就没有足够高的像素化来容纳您的屏幕。
          • @JRrave 我不认为这是我在这里寻找的,我想我想要的是将所有组件调整为全屏或类似的东西。而且我没有在任何地方使用 jPanels,我也无法理解你在说什么。我是一个 15 岁的新手对不起。如果您需要任何信息来知道我想要什么,请问...
          • 您可以将组件视为可以放置在 JFrame 的“顶部”的任何东西。看我的回答
          • 我认为@JRave 指的是您的“灰色背景”问题,虽然没有解决您的尺寸问题,但这是一个公平的答案,恕我直言。 :-)
          猜你喜欢
          • 1970-01-01
          • 2023-03-11
          • 1970-01-01
          • 2021-07-30
          • 1970-01-01
          • 1970-01-01
          • 2016-12-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多