【问题标题】:JFrame Maximize windowJFrame最大化窗口
【发布时间】:2010-10-03 12:46:15
【问题描述】:

我正在使用 swing 制作一个快速而肮脏的动画。我希望窗口最大化。我该怎么做?

【问题讨论】:

    标签: java swing maximize-window


    【解决方案1】:

    如果你使用的是 JFrame,试试这个

    JFrame frame = new JFrame();
    //...
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      类似this.setExtendedState(this.getExtendedState() | this.MAXIMIZED_BOTH);

      import java.awt.*;
      import javax.swing.*;
      
      public class Test extends JFrame
      {
          public Test()
          {
              GraphicsEnvironment env =
      GraphicsEnvironment.getLocalGraphicsEnvironment();
              this.setMaximizedBounds(env.getMaximumWindowBounds());
              this.setExtendedState(this.getExtendedState() | this.MAXIMIZED_BOTH);
          }
      
          public static void main(String[] args)
          {
              JFrame.setDefaultLookAndFeelDecorated(true);
      
              Test t = new Test();
              t.setVisible(true);
          }
      }
      

      【讨论】:

      【解决方案4】:

      设置JFrame全屏的方法是设置MAXIMIZED_BOTH选项,代表MAXIMIZED_VERT | MAXIMIZED_HORIZ,分别设置frame垂直和水平最大化

      package Example;
      import java.awt.GraphicsConfiguration;
      import javax.swing.JFrame;
      import javax.swing.JButton;
      
      public class JFrameExample
      {
          static JFrame frame;
          static GraphicsConfiguration gc;
          public static void main(String[] args)
          {
              frame = new JFrame(gc);
              frame.setTitle("Full Screen Example");
              frame.setExtendedState(MAXIMIZED_BOTH);
      
              JButton button = new JButton("exit");
              b.addActionListener(new ActionListener(){@Override
              public void actionPerformed(ActionEvent arg0){
                  JFrameExample.frame.dispose();
                  System.exit(0);
              }});
      
              frame.add(button);
              frame.setVisible(true);
          }
      }
      

      【讨论】:

        【解决方案5】:

        前提是你要扩展 JFrame:

        public void run() {
            MyFrame myFrame = new MyFrame();
            myFrame.setVisible(true);
            myFrame.setExtendedState(myFrame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
        }
        

        【讨论】:

        • 通过实例访问静态字段是一种不好的做法。请改用JFrame.MAXIMIZED_BOTH
        • 巨大、巨大的错误和上述问题! (好吧,好吧,没有重大后果的轻微警告......)应该是 Frame.MAXIMIZED_BOTH 而不是 JFrame.MAXIMIZED_BOTH! :)
        • 为什么要先调用setVisible(true)?意义重大吗?没有(ubuntu)它也可以正常工作。
        • 如果没有 setVisible(true) 首先,框架的大小不正确。我在setExtendedState()前后都试过了,setVisible()一定是第一个。
        • @Crusader 实际上这里绝对没有问题,因为两者都引用同一个常量字段(JFrame 继承自 Frame)。
        【解决方案6】:

        我喜欢这个版本:

        import java.awt.Dimension;
        import java.awt.GraphicsConfiguration;
        import java.awt.Toolkit;
        import javax.swing.JFrame;
        
        public class Test
        {
            public static void main(String [] args)
            {
                final JFrame frame = new JFrame();
                final GraphicsConfiguration config = frame.getGraphicsConfiguration();
        
                final int left = Toolkit.getDefaultToolkit().getScreenInsets(config).left;
                final int right = Toolkit.getDefaultToolkit().getScreenInsets(config).right;
                final int top = Toolkit.getDefaultToolkit().getScreenInsets(config).top;
                final int bottom = Toolkit.getDefaultToolkit().getScreenInsets(config).bottom;
        
                final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                final int width = screenSize.width - left - right;
                final int height = screenSize.height - top - bottom;
        
                frame.setResizable(false);
                frame.setSize(width,height);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
                frame.setVisible(true);
            }
        }
        

        【讨论】:

        • 我喜欢这个版本。非常感谢。
        【解决方案7】:

        我最终使用了这段代码:

        public void setMaximized(boolean maximized){
            if(maximized){
                DisplayMode mode = this.getGraphicsConfiguration().getDevice().getDisplayMode();
                Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(this.getGraphicsConfiguration());
                this.setMaximizedBounds(new Rectangle(
                        mode.getWidth() - insets.right - insets.left, 
                        mode.getHeight() - insets.top - insets.bottom
                ));
                this.setExtendedState(this.getExtendedState() | JFrame.MAXIMIZED_BOTH);
            }else{
                this.setExtendedState(JFrame.NORMAL);
            }
        }
        

        此选项是所有选项中效果最好的,包括多显示器支持。唯一的缺陷是所有显示器都使用任务栏偏移量是一些配置。

        【讨论】:

          【解决方案8】:

          我已经尝试了这个线程和here 中的解决方案,但是在调用setVisible(true); 之后立即调用setExtendedState(getExtendedState()|Frame.MAXIMIZED_BOTH); 显然不适用于我的环境(Windows 10、JDK 1.8,我的任务栏位于我屏幕的右侧)。这样做仍然会在左侧、右侧和底部留下一个很小的空间。

          然而,对我有用的是,当窗口被激活时调用setExtendedState(...,如下所示:

          public class SomeFrame extends JFrame {
          
              public SomeFrame() {
                  // ...
                  setVisible(true);
                  setResizable(true);
                  // if you are calling setSize() for fallback size, do that here
                  addWindowListener (
                      new WindowAdapter() {
                          private boolean shown = false;
                          @Override
                          public void windowActivated(WindowEvent we) {
                              if(shown) return;
                              shown = true;
                              setExtendedState(getExtendedState()|JFrame.MAXIMIZED_BOTH);
                          }
                      }
                  );
              }
          }
          

          【讨论】:

          • 我在 Windows 10 上遇到了类似的问题,屏幕底部的任务栏。窗口太高,因此与任务栏重叠。您的解决方案奏效了!
          【解决方案9】:

          @kgiannakakis 的答案是完全正确的,但如果有人遇到这个问题并在 Linux 上使用 Java 6(例如 Mint 19 Cinnamon),MAXIMIZED_BOTH 状态有时不适用。

          您可以尝试在设置此状态后调用pack() 方法。

          代码示例:

          public MainFrame() {
              setContentPane(contentPanel); //some JPanel is here
              setPreferredSize(new Dimension(1200, 800));
              setMinimumSize(new Dimension(1200, 800));
              setSize(new Dimension(1200, 800));
              setExtendedState(JFrame.MAXIMIZED_BOTH);
              pack();
          }
          

          如果您在 Windows 上使用 Java 7+ 或 Java 6,则无需这样做。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-27
            • 1970-01-01
            • 1970-01-01
            • 2015-07-21
            • 2010-09-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多