JFrame Maximize window


90

ฉันกำลังรวบรวมภาพเคลื่อนไหวที่รวดเร็วและสกปรกโดยใช้วงสวิง ฉันต้องการให้หน้าต่างขยายใหญ่สุด ฉันจะทำเช่นนั้นได้อย่างไร?

คำตอบ:


134

โดยมีเงื่อนไขว่าคุณกำลังขยาย JFrame:

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

13
การเข้าถึงฟิลด์คงที่ผ่านอินสแตนซ์เป็นแนวทางปฏิบัติที่ไม่ดี ใช้JFrame.MAXIMIZED_BOTHแทน
nimcap

3
ข้อผิดพลาดใหญ่โตและปัญหาข้างต้น! (โอเคดีคำเตือนเล็กน้อยโดยไม่มีผลสำคัญ ... ) ควรเป็น Frame.MAXIMIZED_BOTH ไม่ใช่ JFrame.MAXIMIZED_BOTH! :)
Manius

ทำไมคุณถึงเรียก setVisible (true) ก่อน? มีนัยสำคัญหรือไม่? นอกจากนี้ยังใช้งานได้ดีโดยไม่ต้องใช้ (ubuntu)
AvrDragon

1
โดยไม่ต้องsetVisible(true)แรกกรอบที่ไม่ได้ขนาดที่ถูกต้อง ฉันลองทั้งก่อนและหลังsetExtendedState()และsetVisible()ต้องเป็นที่หนึ่ง
mjibson

2
@Crusader ไม่มีปัญหาอย่างแท้จริงที่นี่เนื่องจากทั้งสองอ้างถึงฟิลด์ค่าคงที่เดียวกัน ( JFrameสืบทอดมาจากFrame)
Guillaume Polet

18

สิ่งที่ต้องการ 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);
    }
}

มีไว้|เพื่ออะไร? มันทำอย่างใดอย่างหนึ่งและถ้าล้มเหลวมันจะทำอย่างอื่น? หรือคุณกำลังระบุตัวเลือกโปรแกรมเมอร์ (เช่นเลือกหนึ่งใน A | B เพื่อไปในสายนี้) ฉันไม่เคยเห็นไวยากรณ์นี้มาก่อน
Pureferret

@Pureferret เป็นตัวดำเนินการ "bitwise inclusive OR" ซึ่งจะคัดลอกบิตหากมีอยู่ในตัวถูกดำเนินการอย่างใดอย่างหนึ่ง ( docs.oracle.com/javase/tutorial/java/nutsandbolts/…หรือtutorialspoint.com/java/java_basic_operators.htm )
VonC



2

ฉันชอบเวอร์ชันนี้:

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);
    }
}

ฉันรักเวอร์ชันนี้ ขอบคุณมาก.
SWIIWII

2

วิธีตั้งค่า JFrame เป็นแบบเต็มหน้าจอคือการตั้งค่าMAXIMIZED_BOTHตัวเลือกที่ย่อมาจากMAXIMIZED_VERT | MAXIMIZED_HORIZซึ่งกำหนดกรอบเพื่อขยายแนวตั้งและแนวนอนตามลำดับ

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);
    }
}

2

ฉันได้ลองวิธีแก้ปัญหาในเธรดนี้และที่นี่แต่การโทรsetExtendedState(getExtendedState()|Frame.MAXIMIZED_BOTH);ทันทีหลังจากโทรsetVisible(true);ดูเหมือนจะไม่ทำงานกับสภาพแวดล้อมของฉัน (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);
                }
            }
        );
    }
}

1
ฉันมีปัญหาคล้ายกันใน Windows 10 กับแถบงานที่ด้านล่างของหน้าจอ หน้าต่างสูงเกินไปดังนั้นแถบงานจึงทับซ้อนกัน วิธีแก้ปัญหาของคุณได้ผล!
ConveniencePatterns

0

ฉันลงเอยด้วยการใช้รหัสนี้:

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);
    }
}

ตัวเลือกนี้ทำงานได้ดีที่สุดในบรรดาตัวเลือกทั้งหมดรวมถึงการรองรับจอภาพหลายจอ ข้อบกพร่องเดียวที่มีคือการใช้ออฟเซ็ตแถบงานบนจอภาพทั้งหมดคือการกำหนดค่าบางอย่าง


0

คำตอบ @kgiannakakis ถูกต้อง แต่ถ้ามีคนติดปัญหานี้และใช้Java 6บนLinux (ตามตัวอย่างเช่น 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();
}

ไม่จำเป็นถ้าคุณใช้ Java 7+ หรือ Java 6 บน Windows

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.