JFrame em Java de tela inteira


110

Eu estarei fazendo um projeto em breve e terei que usar o modo de tela inteira nele.

Ele irá desenhar alguns gráficos na janela. Seria conveniente se eu usar JFrame ou algo semelhante.

Não sei qual será a resolução final da tela. Diga-me se os gráficos serão redimensionados automaticamente.

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?

Você precisa definir "tela inteira". Junto com as respostas abaixo, você pode querer considerar se a moldura deve ser decorada ou não (isso inclui a barra de título e as bordas). A menos que você esteja executando uma pintura personalizada, o redimensionamento não ocorrerá. Se você estiver usando componentes normais de Swing e gerenciadores de layout, deverá descobrir que o layout se ajusta à nova resolução de tela. Claro que você vai querer testá-lo;)
MadProgrammer

Quer usar o Lion Fullscreen?
LanguagesNamedAfterCofee

Respostas:


206

Adicionar:

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

52
Também frame.setUndecorated(true);o tornará em tela inteira.
Yoda

Se você estiver usando GNU / Linux, pode ser necessário definir DisplayMode.BIT_DEPTH_MULTIe DisplayMode.REFRESH_RATE_UNKNOWNao aplicar um novo modo de exibição. Eu não tive que usar setExtendedState. Testado em funcionamento usando Kubuntu 15.10 com Java 8.
code_dredd

Estou usando Java8, para mim, undecorated está lançando uma exceção e quando removi undecorated, o código funciona bem e fez o frame full screen também.
shaILU de

Eu vou te dizer o erro e o motivo. Eu criei uma classe AppFrame (com algumas propriedades padrão) e para fazer qualquer classe como JFrame eu simplesmente a estendo. Ele definiu Visível como verdadeiro. Agora, acima de três linhas tem que estar na mesma ordem, se visível for antes de ExtendedState você obterá um erro abaixo. Quando eu corrigi o erro de pedido, desaparece e você obtém JFrame sem barra de título .........Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
shaILU

@shaILU colocou tudo isso em uma nova questão com um exemplo reproduzível mínimo
Reimeus,

39

Se você quiser colocar seu porta-retratos no modo de tela inteira (como um filme em tela inteira), verifique estas respostas.

As classes java.awt.GraphicsEnvironmente java.awt.GraphicsDevicesão usadas para colocar um aplicativo em modo de tela inteira em uma tela (o dispositivo).

por exemplo:

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: Você pode até adicionar uma barra de menu em uma janela não decorada. Para sair, no seu exemplo, você deve digitar "alt + F4".
cardman


7

Uma maneira é usar o estado estendido. Isso pede ao sistema operacional subjacente para maximizar o JFrame.

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

Outra abordagem seria maximizar manualmente a tela para sua necessidade.

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

Mas isso tem armadilhas no Ubuntu OS. A solução que encontrei foi esta.

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

No Fedora, o problema acima não está presente. Mas existem complicações envolvidas com o Gnome ou KDE . Portanto, é melhor ter cuidado. Espero que isto ajude.


6

A solução mais fácil de todas:

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

Qual é a diferença entre frame.setExtendedState(JFrame.MAXIMIZED_BOTH);e sua solução?
Yoda

Você tem que ter um quadro para sua solução. Enquanto para o meu você não faz e ele vai automaticamente percorrer todas as janelas do programa
Ariel Terrani

Bem feito. Essa correção funciona ainda melhor para o macOS, pois a outra correção ainda manteria a barra de menus visível. Essa correção esconde totalmente tudo. Esta deve ser a resposta aceita.
Panayotis

5

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

Eu espero que isso ajude.


2

irá ajudá-lo a usar o seu objeto instantâneo do quadro

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);


2

Em primeiro lugar, essa é a resolução que você deseja usar 1650,1080,.

Agora adicione:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

Se você tiver problemas com os componentes no JFrame, depois de adicionar todos os componentes usando o frame.add(component)método, adicione a seguinte instrução.

frame.pack();

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

Isso apenas torna o quadro do tamanho da tela


1

Você pode usar a ferramenta de propriedades.
Defina 2 propriedades para seu JFrame :

extendedState 6
resizeable    true

0

Você só precisa disso:

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

Quando você usa o modificador MAXIMIZED_BOTH, ele atingirá o máximo em toda a janela (altura e largura).

Existem alguns que sugeriram usar isto:

frame.setUndecorated(true);

Eu não recomendo, porque sua janela não terá um cabeçalho, portanto, nenhum botão fechar / restaurar / minimizar.


0

Valores destacados que quero dizer:

JFrame - Propriedades


embora a imagem possa fornecer uma resposta implicitamente, tente também elaborar sua resposta com alguma explicação. imho, porém, uma vez que sua resposta é na verdade a mesma que a existente, pense com cuidado se você realmente deseja elaborar e manter esta resposta ou não.
Yohanes Khosiawan 许先汉

-1

Defina 2 propriedades abaixo:

  1. extendedState = 6
  2. resizeable = true

Funciona para mim.


2
A estática final existe por um motivo.
Yoda

Hmmmm ... No netBeans 8.0.1 posso definir JFrame para valores de propriedades "redimensionáveis" + "redimensionáveis" (janela de propriedades)
Rudi Wijaya
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.