3
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,但实际上并没有最大化框架,它只是将窗口大小设置为屏幕的大小,而不实际更改状态,因此单击最大化按钮实际上并没有再次缩小它。

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

4

8 回答 8

4

你有一个错误frame.setExtendedState(JFrame.MAXIMISED_BOTH);

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);你应该改写

于 2016-03-27T19:49:29.837 回答
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);
  }
}
于 2013-09-23T21:27:05.683 回答
0

你试过这个吗?

f.setExtendedState(f.getExtendedState() | JFrame.MAXIMIZED_BOTH);
于 2013-09-23T21:34:30.740 回答
0

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

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

在此处输入图像描述

“正常”状态

在此处输入图像描述

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);
            }
        });
    }
}
于 2013-09-23T23:12:23.577 回答
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());
于 2014-04-26T10:48:33.403 回答
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();
        }
    } );

...在哪里:

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

  • stateAndOrSizeChanged()是处理持久化帧的状态和边界的函数,注意只持久normalStateBounds化而不是由getX()getY()getWidth()和. 返回的值getHeight()

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

于 2021-04-15T15:51:57.193 回答
0

您应该在应用更改时使用它

frame.setResizable(true);
于 2018-06-08T08:11:56.617 回答
-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);
      }
    });
  }
}
于 2013-09-23T21:46:33.130 回答