JFrame w pełnoekranowej Javie


110

Niedługo będę robił projekt i będę musiał użyć w nim trybu pełnoekranowego.

Narysuje grafikę w oknie. Byłoby wygodne, gdybym użył JFrame lub czegoś podobnego.

Nie wiem, jaka będzie ostateczna rozdzielczość ekranu. Powiedz mi, czy grafika zostanie automatycznie przeskalowana?

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?

Musisz zdefiniować „pełny ekran”. Wraz z poniższymi odpowiedziami warto rozważyć, czy ramka powinna być ozdobiona, czy nie (to znaczy zawierać pasek tytułu i obramowanie). Jeśli nie wykonujesz niestandardowego malowania, przeskalowanie nie nastąpi. Jeśli używasz zwykłych komponentów Swing i menedżerów układu, powinieneś zauważyć, że układ dostosowuje się do nowej rozdzielczości ekranu. Oczywiście zechcesz to przetestować;)
MadProgrammer,

Czy chcesz korzystać z pełnego ekranu Lion?
LanguagesNamedAfterCofee

Odpowiedzi:


206

Dodaj:

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

52
Również frame.setUndecorated(true);będzie to prawdziwie pełny ekran.
Yoda

Jeśli używasz systemu GNU / Linux, może być konieczne ustawienie DisplayMode.BIT_DEPTH_MULTIi DisplayMode.REFRESH_RATE_UNKNOWNzastosowanie nowego trybu wyświetlania. Nie musiałem używać setExtendedState. Przetestowano działanie przy użyciu Kubuntu 15.10 z Javą 8.
code_dredd

Używam Java8, dla mnie undecorated rzuca wyjątek, a kiedy usunąłem undecorated, kod działa dobrze i sprawił, że ramka również była na pełnym ekranie.
shaILU

Powiem ci błąd i powód. Stworzyłem jedną klasę AppFrame (z pewnymi domyślnymi właściwościami) i aby stworzyć dowolną klasę jako JFrame, po prostu ją rozszerzam. UstawionoVisible jako true. Teraz powyższe trzy linie muszą być w tej samej kolejności, jeśli widoczne jest przed ExtendedState, pojawi się poniższy błąd. Kiedy poprawiłem błąd zamówienia zniknął i otrzymałeś JFrame bez paska tytułu .........Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
shaILU

@shaILU postawił to wszystko w nowym pytaniu na minimalnym powtarzalnym przykładzie
Reimeus

39

Jeśli chcesz ustawić ramkę w trybie pełnoekranowym (jak film na pełnym ekranie), sprawdź te odpowiedzi.

Klasy java.awt.GraphicsEnvironmenti java.awt.GraphicsDevicesłużą do umieszczania aplikacji w trybie pełnoekranowym na jednym ekranie (dyspozytywnym).

na przykład:

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: Możesz nawet dodać pasek menu do nieozdobionego okna. Aby wyjść, w Twoim przykładzie, musisz wpisać „alt + F4”.
Cardman


7

Jednym ze sposobów jest użycie stanu rozszerzonego. To prosi bazowy system operacyjny o maksymalizację JFrame.

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

Innym podejściem byłoby ręczne maksymalizowanie ekranu zgodnie z wymaganiami.

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

Ale ma to pułapki w systemie Ubuntu. Praca wokół, którą znalazłem, była następująca.

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

W Fedorze powyższy problem nie występuje. Ale są komplikacje związane z Gnome lub KDE . Więc lepiej bądź ostrożny. Mam nadzieję że to pomoże.


6

Najłatwiejsza naprawa w historii:

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

Jaka jest różnica między frame.setExtendedState(JFrame.MAXIMIZED_BOTH);rozwiązaniem a Twoim rozwiązaniem?
Yoda

Musisz mieć ramę do swojego rozwiązania. Podczas gdy dla mnie tego nie robisz i automatycznie przejdzie przez wszystkie okna w programie
Ariel Terrani

Dobra robota. Ta poprawka działa jeszcze lepiej w systemie macOS, ponieważ druga poprawka nadal utrzymywałaby pasek menu widoczny. Ta poprawka całkowicie ukrywa wszystko. To powinna być akceptowana odpowiedź.
Panayotis

5

Po prostu użyj tego kodu:

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

Mam nadzieję, że to pomoże.


2

to pomoże ci użyć obiektu natychmiast po ramie

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);


2

Przede wszystkim jest to rozdzielczość, której chciałbyś użyć 1650,1080,.

Teraz dodaj:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

Jeśli masz problemy z komponentami w JFrame, po dodaniu wszystkich komponentów przy użyciu frame.add(component) metody, dodaj następującą instrukcję.

frame.pack();

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

To sprawia, że ​​ramka ma rozmiar ekranu


1

Możesz użyć narzędzia właściwości.
Ustaw 2 właściwości swojej JFrame :

extendedState 6
resizeable    true

0

Potrzebujesz tylko tego:

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

Kiedy używasz modyfikatora MAXIMIZED_BOTH, będzie on maksymalny w całym oknie (wysokość i szerokość).

Są tacy, którzy zasugerowali użycie tego:

frame.setUndecorated(true);

Nie polecam tego, ponieważ twoje okno nie będzie miało nagłówka, więc nie ma przycisku zamykania / przywracania / minimalizowania.


0

Podkreślone wartości, które mam na myśli:

JFrame - Właściwości


chociaż obraz może udzielić odpowiedzi w sposób dorozumiany, spróbuj również rozwinąć odpowiedź, podając pewne wyjaśnienie. imho, skoro twoja odpowiedź jest w rzeczywistości taka sama, jak już istniejąca, zastanów się, czy naprawdę chcesz ją rozwinąć i zachować, czy nie.
Yohanes Khosiawan 许先汉

-1

Ustaw 2 właściwości poniżej:

  1. ExtendedState = 6
  2. resizeable = true

Mi to pasuje.


2
Ostateczna statystyka ma swój powód.
Yoda

Hmmmm ... W netBeans 8.0.1 mogę ustawić JFrame dla wartości właściwości "resizeable" + "resizeable" (okna właściwości)
Rudi Wijaya
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.