JFrame en Java de pantalla completa


110

Pronto estaré haciendo un proyecto y tendré que usar el modo de pantalla completa en él.

Dibujará algunos gráficos en la ventana. Sería conveniente si uso JFrame o algo similar.

No sé cuál será la resolución final de la pantalla. Por favor, dígame si los gráficos se cambiarán de escala automáticamente.

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?

Necesita definir "pantalla completa". Junto con las respuestas a continuación, es posible que desee considerar si el marco debe estar decorado o no (es decir, incluir la barra de título y los bordes). A menos que esté realizando una pintura personalizada, no se producirá el cambio de escala. Si está utilizando componentes de swing normales y administradores de diseño, debería encontrar que el diseño se ajusta a la nueva resolución de pantalla. Por supuesto que querrás probarlo;)
MadProgrammer

¿Quieres usar Lion Fullscreen?
LanguagesNamedAfterCofee

Respuestas:


206

Añadir:

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

52
También frame.setUndecorated(true);lo hará realmente a pantalla completa.
Yoda

Si está utilizando GNU / Linux, es posible que deba configurar DisplayMode.BIT_DEPTH_MULTIy DisplayMode.REFRESH_RATE_UNKNOWNal aplicar un nuevo modo de visualización. No tuve que usar setExtendedState. Probado en funcionamiento usando Kubuntu 15.10 con Java 8.
code_dredd

Estoy usando Java8, para mí sin decorar es lanzar una excepción y cuando eliminé sin decorar, el código funciona bien y también hizo el marco en pantalla completa.
shaILU

Te diré el error y la razón. Creé una clase AppFrame (con algunas propiedades predeterminadas) y para hacer cualquier clase como JFrame simplemente la extiendo. Ha establecidoVisible como verdadero. Ahora, las tres líneas anteriores deben estar en el mismo orden, si está visible antes de ExtendedState, obtendrá el error inferior. Cuando Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
corrigí el

@shaILU puso todo eso en una nueva pregunta con un ejemplo mínimo reproducible
Reimeus

39

Si desea poner su fotograma en modo de pantalla completa (como una película en pantalla completa), verifique estas respuestas.

Las clases java.awt.GraphicsEnvironmenty java.awt.GraphicsDevicese utilizan para poner una aplicación en modo de pantalla completa en una sola pantalla (el dispositivo).

p.ej:

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: Incluso puede agregar una barra de menú en una ventana sin decoración. Para salir, en su ejemplo, debe escribir "alt + F4".
cardman


7

Una forma es utilizar el estado extendido. Esto le pide al sistema operativo subyacente que maximice el JFrame.

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

Otro enfoque sería maximizar manualmente la pantalla para sus necesidades.

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

Pero esto tiene dificultades en el sistema operativo Ubuntu. El trabajo que encontré fue este.

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

En Fedora, el problema anterior no está presente. Pero hay complicaciones relacionadas con Gnome o KDE . Así que mejor ten cuidado. Espero que esto ayude.


6

La solución más fácil de todos:

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

¿Cuál es la diferencia entre frame.setExtendedState(JFrame.MAXIMIZED_BOTH);tu solución?
Yoda

Tienes que tener un marco para tu solución. Mientras que para el mío no lo hace y automáticamente recorrerá todas las ventanas del programa
Ariel Terrani

Bien hecho. Esta solución funciona incluso mejor para macOS, ya que la otra solución mantendría visible la barra de menú. Esta solución oculta todo por completo. Esta debería ser la respuesta aceptada.
Panayotis

5

Solo usa este código:

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

Espero que esto ayude.


2

te ayudará a usar tu objeto instantáneo del marco

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);


2

Primero que nada, esa es la resolución que le gustaría usar 1650,1080,.

Ahora agregue:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

Si tiene problemas con los componentes de JFrame, luego de haber agregado todos los componentes usando el frame.add(component)método, agregue la siguiente declaración.

frame.pack();

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

Esto solo hace que el marco tenga el tamaño de la pantalla.


1

Puede utilizar la herramienta de propiedades.
Establezca 2 propiedades para su JFrame :

extendedState 6
resizeable    true

0

Solo necesitas esto:

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

Cuando usa el modificador MAXIMIZED_BOTH, alcanzará un máximo en toda la ventana (alto y ancho).

Hay algunos que sugirieron usar esto:

frame.setUndecorated(true);

No lo recomendaré, porque su ventana no tendrá un encabezado, por lo tanto, no hay botón cerrar / restaurar / minimizar.


0

Valores resaltados que quiero decir:

JFrame - Propiedades


Si bien la imagen puede proporcionar una respuesta implícita, intente también elaborar su respuesta con alguna explicación. En mi humilde opinión, sin embargo, dado que su respuesta es en realidad la misma que la existente, piense detenidamente si realmente desea elaborar y mantener esta respuesta o no.
Yohanes Khosiawan 许先汉

-1

Establezca 2 propiedades a continuación:

  1. ExtendedState = 6
  2. redimensionable = verdadero

Esto funciona para mi.


2
La estática final está ahí por una razón.
Yoda

Hmmmm ... En netBeans 8.0.1 puedo configurar JFrame para valores de propiedades "redimensionables" + "redimensionables" (ventanas de propiedades)
Rudi Wijaya
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.