简体   繁体   English

通过Dimension将JFrame最大化到屏幕大小

[英]JFrame maximized to screen size with Dimension

All I can think is that I'm not setting the screen size correctly. 我所能想到的就是我没有正确设置屏幕尺寸。 Logs show that the height and width look correct. 日志显示高度和宽度看起来正确。 From the Swing trail : Swing步道

package net.bounceme.dur.nntp.swing;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.util.logging.Logger;
import javax.swing.*;
import java.awt.*;

public class HelloWorldSwing {

    private static final Logger LOG = Logger.getLogger(HelloWorldSwing.class.getName());

    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("HelloWorldSwing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


       // Container c = frame.getContentPane();
//        frame.getContentPane();
      //  c.setBackground(Color.YELLOW);
        // adjust to need.
        Dimension d = new Dimension(400, 40);
        //c.setPreferredSize(d);

        //Add the ubiquitous "Hello World" label.
        JLabel label = new JLabel("Hello World");
        frame.getContentPane().add(label);

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int height = screenSize.height - 50;
        int width = screenSize.width - 50;
        frame.setSize(height, width);
        frame.setSize(d);
        LOG.info(height + "\t\t\t" + width);
        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                createAndShowGUI();
            }
        });
    }
}

obligatory legal boilerplate: 强制性的法律样板:

/*
 * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle or the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */ 

/**
 * This example, like all Swing examples, exists in a package:
 * in this case, the "start" package.
 * If you are using an IDE, such as NetBeans, this should work 
 * seamlessly.  If you are compiling and running the examples
 * from the command-line, this may be confusing if you aren't
 * used to using named packages.  In most cases,
 * the quick and dirty solution is to delete or comment out
 * the "package" line from all the source files and the code
 * should work as expected.  For an explanation of how to
 * use the Swing examples as-is from the command line, see
 * http://docs.oracle.com/javase/javatutorials/tutorial/uiswing/start/compile.html#package
 */

screenshot: 屏幕截图:

在此处输入图片说明

Try removing frame.pack(); 尝试删除frame.pack(); . This gives expanded frame. 这给出了扩展的框架。 This is because pack() causes the frame to be re-sized . 这是因为pack()会调整框架的大小

  1. Toolkit.getDefaultToolkit().getScreenSize() doesn't take into consideration any additional insets of things like the task/dock bar Toolkit.getDefaultToolkit().getScreenSize()不考虑任务/停靠栏之类的任何其他插入
  2. You're calling JFrame#pack , which is going to resize the frame to the preferred size of its contents 您正在调用JFrame#pack ,它将把框架调整为其内容的首选大小

You should be using JFrame#setExtendedState(JFrame.MAXIMIZED_BOTH) 您应该使用JFrame#setExtendedState(JFrame.MAXIMIZED_BOTH)

You should comment this line in your code: 您应该在代码中注释以下行:

//frame.setSize(d);

Also remove this line: 同时删除此行:

//frame.pack();

Remove the pack() call. 删除pack()调用。 And try setting all three methods being setSize() , setPrefferredSize() and setMaximumSize() with the same dimension. 并尝试将所有三个方法设置为setSize()setPrefferredSize()setMaximumSize()并设置相同的尺寸。

Just to note for those just finding this, 只是为那些刚刚发现这一点的人提供说明

frame.setSize(height, width);

Is backwards, it should have been: 是倒退的,应该是:

frame.setSize(width, height);

Otherwise you will quickly notice when you run the program (unless you have a square screen) your JFrame won't cover part of the right side of your screen. 否则,您将在运行程序时迅速注意到(除非屏幕为正方形),否则JFrame不会覆盖屏幕右侧的一部分。

Also, remove this part of the code to see the JFrame attempt to take up most of the screen (I get most of my screen on a 28" monitor with the above code (without frame.pack() ): 另外,删除代码的这一部分,以查看JFrame尝试占用屏幕的大部分内容(使用上述代码,我将大部分屏幕放在28英寸的显示器上(没有frame.pack() ):

frame.setSize(d);

The above snippet of code is changing you JFrame to the width 400, height 40 that was defined in Dimension d. 上面的代码片段将JFrame更改为Dimension d中定义的宽度400,高度40。

试试这个,

this.setExtendedState(MAXIMIZED_BOTH); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM