JFrame ใน Java แบบเต็มหน้าจอ


111

ฉันจะทำโครงการเร็ว ๆ นี้และฉันจะต้องใช้ โหมดเต็มหน้าจอในนั้น

มันจะวาดภาพกราฟิกบางส่วนในหน้าต่าง มันจะสะดวกสบายถ้าฉันใช้JFrameหรือสิ่งที่คล้ายกัน

ฉันไม่รู้ว่าความละเอียดสุดท้ายของหน้าจอจะเป็นอย่างไร โปรดบอกฉันว่ากราฟิกจะถูกปรับขนาดโดยอัตโนมัติหรือไม่?

JFrame jf = new JFrame();
jf.setSize(1650,1080);
//make it fullscreen;
//now is everything is going to be rescaled so it looks like the original?

คุณต้องกำหนด "เต็มหน้าจอ" นอกจากคำตอบด้านล่างแล้วคุณอาจต้องพิจารณาว่าควรตกแต่งกรอบหรือไม่ (ซึ่งรวมถึงแถบชื่อเรื่องและเส้นขอบ) หากคุณไม่ทำการวาดภาพแบบกำหนดเองการปรับขนาดจะไม่เกิดขึ้น หากคุณใช้ Swing Components ปกติและตัวจัดการเค้าโครงคุณควรพบว่าเค้าโครงปรับตามความละเอียดหน้าจอใหม่ แน่นอนคุณจะต้องทดสอบ;)
MadProgrammer

คุณต้องการใช้ Lion Fullscreen หรือไม่?
LanguagesNamedAfterCofee

คำตอบ:


207

เพิ่ม:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setUndecorated(true);
frame.setVisible(true);

52
นอกจากนี้frame.setUndecorated(true);จะทำให้เต็มหน้าจออย่างแท้จริง
Yoda

หากคุณใช้ GNU / Linux คุณอาจต้องตั้งค่าDisplayMode.BIT_DEPTH_MULTIและDisplayMode.REFRESH_RATE_UNKNOWNเมื่อใช้โหมดการแสดงผลใหม่ setExtendedStateฉันไม่ได้มีการใช้งาน ทดสอบการทำงานโดยใช้ Kubuntu 15.10 กับ Java 8
code_dredd

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

ฉันจะบอกคุณถึงข้อผิดพลาดและเหตุผล ฉันสร้างคลาส AppFrame หนึ่งคลาส (พร้อมคุณสมบัติเริ่มต้นบางอย่าง) และเพื่อที่จะทำให้คลาสใด ๆ เป็น JFrame ฉันเพียงแค่ขยายมัน ได้ setVisible เป็นจริง ตอนนี้เหนือสามบรรทัดจะต้องอยู่ในลำดับเดียวกันหากมองเห็นได้อยู่ก่อน ExtendedState คุณจะได้รับข้อผิดพลาดด้านล่าง เมื่อฉันแก้ไขข้อผิดพลาดของคำสั่งซื้อและคุณได้รับ JFrame โดยไม่มีแถบหัวเรื่อง .........Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
shaILU

@shaILU ใส่คำถามใหม่ทั้งหมดด้วยตัวอย่างที่ทำซ้ำได้น้อยที่สุด
Reimeus

39

หากคุณต้องการให้เฟรมของคุณอยู่ในโหมดเต็มหน้าจอ (เช่นภาพยนตร์แบบเต็มจอ) ให้ตรวจสอบคำตอบเหล่านี้

คลาสjava.awt.GraphicsEnvironmentและjava.awt.GraphicsDeviceใช้สำหรับวางแอปในโหมดเต็มหน้าจอบนหน้าจอเดียว (การจัดการ)

เช่น:

static GraphicsDevice device = GraphicsEnvironment
        .getLocalGraphicsEnvironment().getScreenDevices()[0];

public static void main(String[] args) {

    final JFrame frame = new JFrame("Display Mode");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setUndecorated(true);

    JButton btn1 = new JButton("Full-Screen");
    btn1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            device.setFullScreenWindow(frame);
        }
    });
    JButton btn2 = new JButton("Normal");
    btn2.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            device.setFullScreenWindow(null);
        }
    });

    JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    panel.add(btn1);
    panel.add(btn2);
    frame.add(panel);

    frame.pack();
    frame.setVisible(true);

}

@ พอลวาร์กัส: คุณยังสามารถเพิ่มแถบเมนูบนหน้าต่างที่ไม่ได้ตกแต่ง สำหรับการเลิกใช้ในตัวอย่างคุณต้องพิมพ์ "alt + F4"
การ์ดแมน


7

วิธีหนึ่งคือการใช้ Extended State สิ่งนี้ขอให้ระบบปฏิบัติการพื้นฐานเพิ่ม JFrame ให้สูงสุด

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

วิธีอื่นคือการขยายหน้าจอด้วยตนเองตามความต้องการของคุณ

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight());
setLocationRelativeTo(null);

แต่สิ่งนี้มีข้อผิดพลาดใน Ubuntu OS วิธีแก้ปัญหาที่ฉันพบคือสิ่งนี้

if (SystemHelper.isUnix()) {
    getContentPane().setPreferredSize(
    Toolkit.getDefaultToolkit().getScreenSize());
    pack();
    setResizable(false);
    show();

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            Point p = new Point(0, 0);
            SwingUtilities.convertPointToScreen(p, getContentPane());
            Point l = getLocation();
            l.x -= p.x;
            l.y -= p.y;
            setLocation(p);
        }
    });
}

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight());
setLocationRelativeTo(null);

ใน Fedora ไม่มีปัญหาข้างต้น แต่มีภาวะแทรกซ้อนที่เกี่ยวข้องกับGnomeหรือKDE ดังนั้นควรระมัดระวัง หวังว่านี่จะช่วยได้


6

แก้ไขได้ง่ายที่สุด:

for ( Window w : Window.getWindows() ) {
    GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow( w );
}

ความแตกต่างระหว่างframe.setExtendedState(JFrame.MAXIMIZED_BOTH);และวิธีแก้ปัญหาของคุณคืออะไร?
Yoda

คุณต้องมีกรอบสำหรับการแก้ปัญหาของคุณ ในขณะที่สำหรับฉันคุณไม่ทำและมันจะวนรอบหน้าต่างทั้งหมดในโปรแกรมโดยอัตโนมัติ
Ariel Terrani

ทำได้ดี. การแก้ไขนี้ทำงานได้ดียิ่งขึ้นสำหรับ macOS เนื่องจากการแก้ไขอื่น ๆ จะยังคงมองเห็นแถบเมนูอยู่ การแก้ไขนี้ซ่อนทุกอย่างโดยสิ้นเชิง นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Panayotis

5

เพียงใช้รหัสนี้:

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

public class FullscreenJFrame extends JFrame {
    private JPanel contentPane = new JPanel();
    private JButton fullscreenButton = new JButton("Fullscreen Mode");
    private boolean Am_I_In_FullScreen = false;
    private int PrevX, PrevY, PrevWidth, PrevHeight;

    public static void main(String[] args) {
        FullscreenJFrame frame = new FullscreenJFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 500);
        frame.setVisible(true);
    }

    public FullscreenJFrame() {
        super("My FullscreenJFrame");

        setContentPane(contentPane);

        // From Here starts the trick
        FullScreenEffect effect = new FullScreenEffect();

        fullscreenButton.addActionListener(effect);

        contentPane.add(fullscreenButton);
        fullscreenButton.setVisible(true);
    }

    private class FullScreenEffect implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            if (Am_I_In_FullScreen == false) {
                PrevX = getX();
                PrevY = getY();
                PrevWidth = getWidth();
                PrevHeight = getHeight();

                // Destroys the whole JFrame but keeps organized every Component
                // Needed if you want to use Undecorated JFrame dispose() is the
                // reason that this trick doesn't work with videos.
                dispose();
                setUndecorated(true);

                setBounds(0, 0, getToolkit().getScreenSize().width,
                        getToolkit().getScreenSize().height);
                setVisible(true);
                Am_I_In_FullScreen = true;
            } else {
                setVisible(true);
                setBounds(PrevX, PrevY, PrevWidth, PrevHeight);
                dispose();
                setUndecorated(false);
                setVisible(true);
                Am_I_In_FullScreen = false;
            }
        }
    }
}

ฉันหวังว่านี่จะช่วยได้.



2

ก่อนอื่นนั่นคือความละเอียดที่คุณต้องการใช้ 1650,1080ครั้งแรกของทั้งหมดที่มีความละเอียดที่คุณต้องการจะใช้

ตอนนี้เพิ่ม:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

หากคุณมีปัญหากับส่วนประกอบบน JFrame หลังจากที่คุณได้เพิ่มส่วนประกอบทั้งหมดโดยใช้frame.add(component)วิธีนี้แล้วให้เพิ่มคำสั่งต่อไปนี้

frame.pack();



0

คุณต้องการสิ่งนี้เท่านั้น:

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

เมื่อคุณใช้โมดิฟายเออร์ MAXIMIZED_BOTH ตัวปรับขยายจะสูงสุดตลอดทั้งหน้าต่าง (ความสูงและความกว้าง)

มีบางอย่างที่แนะนำให้ใช้สิ่งนี้:

frame.setUndecorated(true);

ฉันจะไม่แนะนำเพราะหน้าต่างของคุณไม่มีส่วนหัวจึงไม่มีปุ่มปิด / กู้คืน / ย่อขนาด


0

ค่าที่เน้นที่ฉันหมายถึง:

JFrame - คุณสมบัติ


ในขณะที่รูปภาพอาจให้คำตอบโดยปริยายโปรดพยายามอธิบายคำตอบของคุณอย่างละเอียดด้วย อย่างไรก็ตามเนื่องจากคำตอบของคุณตรงกับคำตอบที่มีอยู่แล้วโปรดคิดให้ดีว่าคุณต้องการอธิบายอย่างละเอียดและเก็บคำตอบนี้ไว้หรือไม่
Yohanes Khosiawan 许先汉

-1

ตั้งค่าคุณสมบัติ 2 รายการด้านล่าง:

  1. ExtendedState = 6
  2. ปรับขนาดได้ = จริง

มันใช้ได้กับฉัน


2
สถิตยศาสตร์สุดท้ายมีเหตุผล
Yoda

อืมม ... ใน netBeans 8.0.1 ฉันสามารถตั้งค่า JFrame สำหรับค่าคุณสมบัติ "resizeable" + "resizeable" (หน้าต่างคุณสมบัติ)
Rudi Wijaya
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.