JFrame.setExtendedState实际上没有最大化

时间:2013-09-23 21:19:22

标签: java swing jframe fullscreen

public static void main(String args[]){
    JFrame frame = new JFrame();
    frame.setExtendedState(JFrame.MAXIMISED_BOTH);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

我已经使用此代码来最大化JFrame,但实际上不是最大化框架,而是将窗口大小设置为屏幕大小,而不实际更改状态,因此单击最大化按钮不会; t实际上再次缩小它。

我使用了错误的命令还是什么?

8 个答案:

答案 0 :(得分:3)

frame.setExtendedState(JFrame.MAXIMISED_BOTH);

中有错误

您应该写frame.setExtendedState(JFrame.MAXIMIZED_BOTH);而不是

答案 1 :(得分:0)

默认情况下,您必须将其最大化。因为最大化按钮可以开箱即用。

frame.setExtendedState(JFrame.MAXIMIZED_BOTH)适用于Linux x64。这是我测试过的程序:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test implements ActionListener {

  public static void main(String... args) {
    new Test();
  }

  private JFrame frame;

  public Test() {
    frame = new JFrame();
    frame.add(new JLabel("Hi!"), BorderLayout.CENTER);
    JButton button = new JButton("maximize");
    button.addActionListener(this);
    frame.add(button, BorderLayout.SOUTH);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
  }


  @Override
  public void actionPerformed(ActionEvent e) {
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
  }
}

答案 2 :(得分:0)

你试过这个吗?

f.setExtendedState(f.getExtendedState() | JFrame.MAXIMIZED_BOTH);

答案 3 :(得分:0)

根据您提供的示例并在Windows 7上运行...

“最大化”状态(这是窗口的裁剪版本,因为原始版本非常大)

enter image description here

“正常”状态

enter image description here

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ExtendedFrame {

    public static void main(String[] args) {
        new ExtendedFrame();
    }

    public ExtendedFrame() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
//                frame.setExtendedState(JFrame.MAXIMISED_BOTH);
                frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

答案 4 :(得分:0)

这对我有用:

我们需要将setSize()和setExtendedState组合在一起     JFrame frame = new JFrame();

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); // aligns itself with windows task bar
// set maximum screen   
frame.setSize((int)Toolkit.getDefaultToolkit().getScreenSize().getWidth(), (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight());

答案 5 :(得分:0)

应用更改

时应使用此功能
frame.setResizable(true);

答案 6 :(得分:0)

迟到七年总比没有好,对吧?

问题没有提供 SSCCE 大概是因为这不是所涉及的所有代码。一小段代码提供了原样的工作,所以几乎所有以前的答案都在说“对我有用”。因此,问题肯定出在未显示的其余代码上。

我们不能确定代码的其余部分做了什么,但我怀疑它试图持久化框架的状态和边界,并在以后恢复该状态和边界,这就是失败的原因。 OP 7 年前没有收到答案,因为他们没有解释实际问题是什么,但是这个问题会被更多人看到,所以这里是:

理论上,持久化框架的状态和边界应该是小菜一碟,但实际上并非如此。

这是GUI应用程序中很常见的问题,基本上是代表程序员犯了一个常见的错误。然而,应该注意的是,各种广泛使用的 GUI 框架(当然还有 Java 世界中的 Swing 和 SWT)以特定的反常方式运行,这使得很容易犯错误。

问题始于这些框架不支持“最大化”事件(废话!),因此您可以检测到您的框架已最大化的唯一方法是侦听“调整大小”事件。因此,您大概是在“调整大小”的事件处理程序中保持框架的状态和尺寸。

由于最大化框架而发生“调整大小”事件后,框架边界是最大化边界你的框架,这是无关紧要的,如果你犯了坚持它们的错误,你会在脚下开枪。

因此,解决方案是手动跟踪框架的“正常状态”边界,并仅保留这些边界。这可以通过以下方式完成:

    addComponentListener( new ComponentAdapter()
    {
        @Override public void componentResized( ComponentEvent e )
        {
            if( (getExtendedState() & MAXIMIZED_HORIZ) == 0 )
                normalStateBounds.width = getWidth();
            if( (getExtendedState() & MAXIMIZED_VERT) == 0 )
                normalStateBounds.height = getHeight();
            stateAndOrSizeChanged();
        }
        @Override public void componentMoved( ComponentEvent e )
        {
            if( (getExtendedState() & MAXIMIZED_HORIZ) == 0 )
                normalStateBounds.x = getX();
            if( (getExtendedState() & MAXIMIZED_VERT) == 0 )
                normalStateBounds.y = getY();
            stateAndOrSizeChanged();
        }
    } );

...其中:

  • normalStateBounds 定义为 private final Rectangle normalStateBounds = new Rectangle(); 并包含组件处于“正常”(即未最小化或最大化)状态时的边界

  • stateAndOrSizeChanged() 是处理保持框架状态和边界的函数,注意只保持 normalStateBounds 而不是 getX() 返回的值,{{1 }}、getY()getWidth()

从持久化加载状态和边界时,您可以简单地调用 getHeight() 后跟 setBounds(),并且应该在调用 setExtendedState() 之前执行此操作以避免您的框架出现恢复的可能性在最大化之前眨眼。对 setVisible( true ) 的调用将设置非最大化边界,而对 setBounds() 的调用可能会最大化您的框架,但如果您随后恢复它,它将假定您设置的非最大化边界。

答案 7 :(得分:-1)

它适用于我在WinXP机器上运行Java 7。

为了记录,这就是SSCCE的样子:

import javax.swing.*;

public class JFrameExtendedDemo
{
  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(300, 200);
        f.setLocationRelativeTo(null);
        f.setVisible(true);

        // Then:
        f.setExtendedState(JFrame.MAXIMIZED_BOTH);
      }
    });
  }
}