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?
Yoda
fonte
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);
Reimeus
fonte
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
fonte
@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.

Chan
fonte
6

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

for ( Window w : Window.getWindows() ) {
    GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow( w );
}
Ariel Terrani
fonte
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.

PeGiannOS
fonte
2

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

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

Jerin Stephen
fonte
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();
Saad K
fonte
1
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize()));

Isso apenas torna o quadro do tamanho da tela

Astuto
fonte
1

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

extendedState 6
resizeable    true
Burhan Yaprak
fonte
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.

Kyon Perez
fonte
0

Valores destacados que quero dizer:

JFrame - Propriedades

Rudi Wijaya
fonte
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.

Rudi Wijaya
fonte
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