JFrame в полноэкранном режиме Java


111

Я скоро буду делать проект, и мне придется использовать в нем полноэкранный режим.

Он будет рисовать графику в окне. Было бы удобно использовать JFrame или что-то подобное.

Не знаю, какое будет окончательное разрешение экрана. Подскажите пожалуйста, будет ли масштабироваться графика автоматически?

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?

Вам нужно определить «полный экран». Наряду с ответами, приведенными ниже, вы можете подумать, нужно ли оформлять фрейм (включая строку заголовка и границы). Если вы не выполняете заказное рисование, масштабирование не произойдет. Если вы используете обычные компоненты Swing и менеджеры компоновки, вы должны обнаружить, что компоновка подстраивается под новое разрешение экрана. Конечно, вы захотите это протестировать;)
MadProgrammer

Вы хотите использовать полноэкранный режим Lion?
LanguagesNamedAfterCofee

Ответы:


207

Добавить:

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

52
И frame.setUndecorated(true);сделает его действительно полноэкранным.
Йода

Если вы используете GNU / Linux, вам может потребоваться установить DisplayMode.BIT_DEPTH_MULTIи DisplayMode.REFRESH_RATE_UNKNOWNпри применении нового режима отображения. Мне не пришлось использовать setExtendedState. Протестировано: работа с использованием Kubuntu 15.10 и Java 8.
code_dredd

Я использую Java8, для меня без декорирования возникает исключение, и когда я удалил недекорированный код, код работает нормально и также сделал полноэкранный фрейм.
shaILU

Я вам скажу ошибку и причину. Я создал один класс AppFrame (с некоторыми свойствами по умолчанию) и, чтобы сделать любой класс как JFrame, я просто расширяю его. Он установилVisible как true. Теперь три строки должны быть в том же порядке, если они видны до ExtendedState, вы получите ошибку ниже. Когда я исправил ошибку порядка, вы получите JFrame без заголовка .........Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
shaILU

@shaILU поместил все это в новый вопрос с минимально воспроизводимым примером
Реймеус

39

Если вы хотите перевести свой кадр в полноэкранный режим (как фильм в полноэкранном режиме), проверьте эти ответы.

Классы java.awt.GraphicsEnvironmentи java.awt.GraphicsDeviceиспользуются для перевода приложения в полноэкранный режим на один экран (диспозитив).

например:

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: Вы даже можете добавить строку меню в окно без украшений. Для выхода в вашем примере вам нужно набрать «alt + F4».
cardman


7

Один из способов - использовать расширенное состояние. Это требует от базовой ОС максимизировать JFrame.

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

Другой подход - вручную развернуть экран в соответствии с вашими требованиями.

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

Но в ОС Ubuntu есть подводные камни. Я нашел вот что.

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 вышеуказанной проблемы нет. Но есть сложности, связанные с Gnome или KDE . Так что лучше будь осторожнее. Надеюсь это поможет.


6

Самое простое исправление:

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

В чем разница между frame.setExtendedState(JFrame.MAXIMIZED_BOTH);вашим решением и вашим решением?
Йода

У вас должна быть рамка для вашего решения. В то время как в моем случае вы этого не делаете, и он автоматически перебирает все окна в программе
Ариэль Террани,

Отлично сработано. Это исправление работает даже лучше для macOS, поскольку другое исправление по-прежнему сохраняет панель меню видимой. Это исправление полностью скрывает все. Это должен быть принятый ответ.
Панайотис

5

Просто используйте этот код:

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

Надеюсь, это поможет.



2

Прежде всего, это разрешение, которое вы хотели бы использовать 1650,1080.

Теперь добавим:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

Если у вас есть проблемы с компонентами в JFrame, то после добавления всех компонентов с помощью frame.add(component)метода добавьте следующий оператор.

frame.pack();

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

Это просто делает рамку размером с экран


1

Вы можете использовать инструмент свойств.
Установите 2 свойства для вашего JFrame :

extendedState 6
resizeable    true

0

Вам понадобится только это:

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

Когда вы используете модификатор MAXIMIZED_BOTH, он будет максимальным по всему окну (высота и ширина).

Некоторые из них предлагают использовать это:

frame.setUndecorated(true);

Я не буду рекомендовать это, потому что у вашего окна не будет заголовка, поэтому нет кнопки закрытия / восстановления / свертывания.


0

Ценности подчеркнули, что я имею в виду:

JFrame - Свойства


хотя изображение может дать ответ неявно, попробуйте также дополнить свой ответ некоторыми пояснениями. imho, однако, поскольку ваш ответ на самом деле такой же, как и существующий, пожалуйста, подумайте, действительно ли вы хотите уточнить и сохранить этот ответ или нет.
Йоханес Хосиаван 许先汉

-1

Установите 2 свойства ниже:

  1. extendedState = 6
  2. resizeable = true

Меня устраивает.


2
Окончательная статика существует не просто так.
Йода

Хммм ... В netBeans 8.0.1 я могу установить JFrame для значений свойств "изменяемый размер" + "изменяемый размер" (окна свойств)
Руди Виджая
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.