JFrame di Java layar penuh

110

Saya akan segera mengerjakan sebuah proyek dan saya harus menggunakan mode layar penuh di dalamnya.

Ini akan menggambar beberapa grafik di jendela. Akan lebih nyaman jika saya menggunakan JFrame atau yang serupa.

Saya tidak tahu apa resolusi akhir dari layar tersebut. Tolong beri tahu saya jika grafik akan diskalakan ulang secara otomatis?

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?
Yoda
sumber
Anda perlu mendefinisikan "layar penuh". Bersamaan dengan jawaban di bawah ini, Anda mungkin ingin mempertimbangkan apakah bingkai harus dihias atau tidak (yang termasuk bilah judul dan batas). Kecuali Anda melakukan pengecatan khusus, penskalaan ulang tidak akan terjadi. Jika Anda menggunakan Komponen Ayun normal dan manajer Tata Letak, Anda harus menemukan bahwa tata letak menyesuaikan dengan resolusi layar baru. Tentu saja Anda ingin mengujinya;)
MadProgrammer
Apakah Anda ingin menggunakan Lion Fullscreen?
LanguagesNamedAfterCofee

Jawaban:

206

Menambahkan:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setUndecorated(true);
frame.setVisible(true);
Reimeus
sumber
52
Juga frame.setUndecorated(true);akan membuatnya menjadi layar penuh.
Yoda
Jika Anda menggunakan GNU / Linux, Anda mungkin perlu mengatur DisplayMode.BIT_DEPTH_MULTIdan DisplayMode.REFRESH_RATE_UNKNOWNsaat menerapkan mode tampilan baru. Saya tidak harus menggunakan setExtendedState. Diuji bekerja menggunakan Kubuntu 15.10 dengan Java 8.
code_dredd
Saya menggunakan Java8, bagi saya yang tidak didekorasi adalah pengecualian dan ketika saya menghapus tanpa dekorasi, kode berfungsi dengan baik dan juga membuat bingkai layar penuh.
shaILU
Saya akan memberi tahu Anda kesalahan dan alasannya. Saya membuat satu kelas AppFrame (dengan beberapa properti default) dan untuk membuat kelas apa pun sebagai JFrame, saya cukup memperluasnya. Ini telah setVisible sebagai true. Sekarang di atas tiga baris harus dalam urutan yang sama, jika terlihat sebelum ExtendedState Anda akan mendapatkan kesalahan di bawah ini. Ketika saya mengoreksi kesalahan pesanan hilang dan Anda mendapatkan JFrame tanpa bilah judul .........Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
shaILU
@shaILU menempatkan semua itu ke dalam pertanyaan baru dengan contoh minimal yang dapat direproduksi
Reimeus
39

Jika Anda ingin meletakkan bingkai Anda dalam mode layar penuh (seperti film dalam layar penuh), periksa jawaban ini.

Kelas java.awt.GraphicsEnvironmentdan java.awt.GraphicsDevicedigunakan untuk meletakkan aplikasi dalam mode layar penuh pada satu layar (dispositif).

misalnya:

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

}
Paul Vargas
sumber
@Paul Vargas: Anda bahkan dapat menambahkan bilah menu di jendela yang tidak didekorasi. Untuk berhenti, dalam contoh Anda, Anda harus mengetik "alt + F4".
cardman
7

Salah satu caranya adalah dengan menggunakan Extended State. Ini meminta OS yang mendasari untuk memaksimalkan JFrame.

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

Pendekatan lainnya adalah dengan memaksimalkan layar secara manual untuk kebutuhan Anda.

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

Tetapi ini memiliki jebakan di OS Ubuntu. Pekerjaan di sekitar yang saya temukan adalah ini.

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

Di Fedora masalah di atas tidak ada. Tetapi ada komplikasi yang terlibat dengan Gnome atau KDE . Jadi lebih baik hati-hati. Semoga ini membantu.

Chan
sumber
6

Perbaikan termudah yang pernah ada:

for ( Window w : Window.getWindows() ) {
    GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow( w );
}
Ariel Terrani
sumber
Apa perbedaan antara frame.setExtendedState(JFrame.MAXIMIZED_BOTH);dan solusi Anda?
Yoda
Anda harus memiliki kerangka untuk solusi Anda. Sedangkan untuk milik saya Anda tidak melakukannya dan secara otomatis akan melalui semua jendela dalam program
Ariel Terrani
Sudah selesai dilakukan dengan baik. Perbaikan ini bekerja lebih baik untuk macOS, karena perbaikan lainnya akan tetap membuat bilah menu tetap terlihat. Perbaikan ini benar-benar menyembunyikan segalanya. Ini harus menjadi jawaban yang diterima.
Panayotis
5

Cukup gunakan kode ini:

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

Saya harap ini membantu.

PeGiannOS
sumber
2

itu akan membantu Anda menggunakan objek Anda secara instan dari bingkai

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

Jerin Stephen
sumber
2

Pertama-tama, itu adalah resolusi yang ingin Anda gunakan 1650,1080,.

Sekarang tambahkan:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

Jika Anda memiliki masalah dengan komponen di JFrame, maka setelah Anda menambahkan semua komponen menggunakan frame.add(component)metode ini, tambahkan pernyataan berikut.

frame.pack();
Saad K
sumber
1
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize()));

Ini hanya membuat bingkai seukuran layar

Licik
sumber
1

Anda dapat menggunakan alat properti.
Setel 2 properti untuk JFrame Anda :

extendedState 6
resizeable    true
Burhan Yaprak
sumber
0

Anda hanya membutuhkan ini:

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

Saat Anda menggunakan pengubah MAXIMIZED_BOTH, itu akan memaksimalkan semua jendela (tinggi dan lebar).

Ada beberapa yang menyarankan menggunakan ini:

frame.setUndecorated(true);

Saya tidak akan merekomendasikannya, karena jendela Anda tidak akan memiliki tajuk, sehingga tidak ada tombol tutup / pulihkan / minimalkan.

Kyon Perez
sumber
0

Nilai-nilai yang saya soroti yang saya maksud:

JFrame - Properti

Rudi Wijaya
sumber
Sementara gambar mungkin memberikan jawaban secara tersirat, coba uraikan juga jawaban Anda dengan beberapa penjelasan. imho, karena jawaban Anda sebenarnya sama dengan jawaban yang sudah ada, harap pikirkan baik-baik apakah Anda benar-benar ingin menguraikan dan menyimpan jawaban ini atau tidak.
Yohanes Khosiawan 许先汉
-1

Tetapkan 2 properti di bawah ini:

  1. extendedState = 6
  2. resizeable = true

Ini bekerja untuk saya.

Rudi Wijaya
sumber
2
Statika terakhir ada karena suatu alasan.
Yoda
Hmmmm ... Di netBeans 8.0.1 saya dapat mengatur JFrame untuk nilai properti "resizeable" + "resizeable" (jendela properti)
Rudi Wijaya