Tam ekran Java'da JFrame


110

Yakında bir proje yapacağım ve içinde tam ekran modunu kullanmam gerekecek .

Pencerede bazı grafikler çizecektir. JFrame veya benzeri bir şey kullanırsam uygun olur .

Ekranın nihai çözünürlüğünün ne olacağını bilmiyorum. Lütfen bana grafiklerin otomatik olarak yeniden ölçeklenip ölçeklenmeyeceğini söyleyin.

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?

"Tam ekranı" tanımlamanız gerekiyor. Aşağıdaki cevapların yanı sıra, çerçevenin dekore edilip edilmeyeceğini de düşünebilirsiniz (buna başlık çubuğu ve kenarlıklar dahil). Özel boyama yapmadığınız sürece yeniden ölçeklendirme gerçekleşmez. Normal Swing Bileşenleri ve bir Düzen yöneticileri kullanıyorsanız, yerleşimin yeni ekran çözünürlüğüne göre ayarlandığını görmelisiniz. Tabii ki test etmek isteyeceksiniz;)
MadProgrammer

Lion Fullscreen'i kullanmak istiyor musunuz?
LanguagesNamedAfterCofee

Yanıtlar:


206

Ekle:

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

52
Ayrıca frame.setUndecorated(true);onu gerçekten tam ekran yapacak.
Yoda

Eğer GNU / Linux kullanıyorsanız, sette gerekebilir DisplayMode.BIT_DEPTH_MULTIve DisplayMode.REFRESH_RATE_UNKNOWNyeni görüntü modu uygularken. Kullanmak zorunda değildim setExtendedState. Java 8 ile Kubuntu 15.10 kullanılarak test edilmiştir.
code_dredd

Java8 kullanıyorum, benim için dekore edilmemiş istisna atıyor ve bezemesiz kaldırdığımda kod iyi çalışıyor ve çerçeveyi tam ekran yaptı.
shaILU

Size hatayı ve sebebini söyleyeceğim. Bir AppFrame sınıfı oluşturdum (bazı varsayılan özelliklerle) ve herhangi bir sınıfı JFrame olarak yapmak için basitçe genişletiyorum. True olarak setVisible'a sahiptir. Şimdi üç satırın üstündeki satırlar aynı sırada olmalıdır, eğer görünür, ExtendedState'ten önce ise, aşağıdaki hatayı alırsınız. Sipariş hatasını düzelttiğimde ve başlık çubuğu olmayan Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
JFrame'i aldığınızda


39

Çerçevenizi tam ekran moduna (tam ekran film gibi) koymak istiyorsanız, bu yanıtları kontrol edin.

Sınıflar java.awt.GraphicsEnvironmentve java.awt.GraphicsDevicebir ekran (dispositif) tam ekran modunda konulan bir uygulama için kullanılır.

Örneğin:

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: Bezemesiz bir pencereye bir menü çubuğu bile ekleyebilirsiniz. Çıkmak için, örneğinizde "alt + F4" yazmanız gerekir.
kartçı


7

Bunun bir yolu, Genişletilmiş Durum'u kullanmaktır. Bu, temeldeki işletim sisteminden JFrame'i maksimize etmesini ister.

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

Diğer bir yaklaşım, ihtiyacınız için ekranı manuel olarak maksimize etmek olacaktır.

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

Ancak bunun Ubuntu OS'de tuzakları var. Bulduğum etraftaki çalışma şuydu.

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'da yukarıdaki sorun mevcut değil. Ancak Gnome veya KDE ile ilgili bazı zorluklar var . Bu yüzden dikkatli olsan iyi olur. Bu yardımcı olur umarım.


6

Şimdiye kadarki en kolay düzeltme:

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

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);Sizin çözümünüzle aranızdaki fark nedir ?
Yoda

Çözümünüz için bir çerçeveye sahip olmalısınız.
Benim için yapmıyorsun

Aferin. Diğer düzeltme menü çubuğunu görünür durumda tutacağından, bu düzeltme macOS için daha da iyi çalışıyor. Bu düzeltme her şeyi tamamen gizler. Kabul edilen cevap bu olmalıdır.
Panayotis

5

Sadece şu kodu kullanın:

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

Umarım bu yardımcı olur.


2

nesnenizi çerçevenin anında kullanmanıza yardımcı olur

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);


2

Her şeyden önce, kullanmak isteyeceğiniz çözünürlük budur 1650,1080.

Şimdi ekleyin:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

JFrame'deki bileşenlerle ilgili sorunlarınız varsa, frame.add(component)yöntemi kullanarak tüm bileşenleri ekledikten sonra aşağıdaki ifadeyi ekleyin.

frame.pack();

1
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize()));

Bu sadece çerçeveyi ekranın boyutuna getirir


1

Özellikler aracını kullanabilirsiniz. JFrame'iniz
için 2 özellik ayarlayın :

extendedState 6
resizeable    true

0

Sadece buna ihtiyacınız var:

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

MAXIMIZED_BOTH değiştiriciyi kullandığınızda, pencere boyunca maksimuma çıkacaktır (yükseklik ve genişlik).

Bunu kullanmayı önerenler var:

frame.setUndecorated(true);

Bunu önermeyeceğim, çünkü pencerenizin bir başlığı olmayacak, dolayısıyla kapat / geri yükle / küçült düğmesi olmayacak.


0

Değerler, şunu demek istediğimi vurguladı:

JFrame - Özellikler


resim dolaylı olarak bir cevap verebilir, ancak lütfen cevabınızı bir açıklama ile detaylandırmaya çalışın. imho, yine de, cevabınız gerçekte mevcut olanla aynı olduğundan, lütfen bu cevabı gerçekten ayrıntılandırıp saklamak isteyip istemediğinizi dikkatlice düşünün.
Yohanes Khosiawan 许先汉

-1

Aşağıdaki 2 özelliği ayarlayın:

  1. extendedState = 6
  2. yeniden boyutlandırılabilir = doğru

Benim için çalışıyor.


2
Nihai statiğin bir nedeni var.
Yoda

Hmmmm ... netBeans 8.0.1'de "yeniden boyutlandırılabilir" + "yeniden boyutlandırılabilir" özelliklerin değerleri için JFrame ayarlayabilirim (özellikler pencereleri)
Rudi Wijaya
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.