JFrame у повноекранному Java


110

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

Він намалюватиме графіку у вікні. Було б зручно, якщо я використовую 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

Відповіді:


206

Додати:

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, для мене undecorated - це викид винятку, і коли я видаляю неоздоровлений, код працює нормально, а також робив кадр на весь екран.
shaILU

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

@shaILU поставив усе це у новому запитанні з мінімально відтворюваним прикладом
Reimeus

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".
кардман


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 - Властивості


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

-1

Встановіть 2 властивості нижче:

  1. extensionState = 6
  2. змінити розмір = вірно

Це працює для мене.


2
Підсумкова статистика є з причини.
Йода

Хмммм ... У netBeans 8.0.1 я можу встановити JFrame для значень властивостей "змінити розмір" + "змінити розмір" (вікна властивостей)
Rudi Wijaya
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.