Как правильно вывести java полный экран

Теперь то, что я делаю в своей программе, это то, что я использую setundecorated = true и MAXIMIZED_BOTH. Поэтому он заставляет его работать в полноэкранном режиме, и дисплей выглядит очень красиво. Но проблема в том, что есть изображения (границы) на левой и правой стороны экрана, а также синим фоном. Что происходит, так это то, что при изменении экранов и разрешений они нарушаются и не отображаются должным образом. Эти серые пятна снова появляются

enter image description here

История:

У меня есть Java-программа, которую я всегда хотел открыть в полноэкранном режиме; Я не смог найти способ сделать это правильно, поэтому я скорректировал минимум до (1370, 727) и максимальный размер. Таким образом, он начал нормально открываться на моем ноутбуке, но когда я сменил дисплей ноутбука на ЖК-дисплей, он начал создавать проблемы:

Он открывается в меньшем окне: Login Window

Если я затем нажимаю кнопку максимизации, серая область появляется сбоку и внизу (я хотел, чтобы элементы на экране растягивались или центрировались): enter image description here

И вот, например, в нижней части находится серый патч. Вместо этого я хочу, чтобы фон охватывал весь экран. enter image description here

Обновление 1 Если я перейду к растягиваемому gridbaglayout, это код, который я использовал, и что происходит:

Menu.setExtendedState(MAXIMIZED_BOTH);
GridBagLayout gbl = new GridBagLayout();
Menu.setLayout(gbl);
JButton component = new JButton("1");
gbl.layoutContainer(Menu);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.NONE;
gbl.setConstraints(component, gbc);
Menu.add(component);
Menu.pack();
Menu.setVisible(true);

enter image description here

Вопрос

  • Как установить "this" фрейм setExtendedState (MAXIMIZED_BOTH), как я сделал другим? (если я делаю это в основной функции, я получаю сообщение об ошибке, даже если я создаю функцию для этого и назову его в основном, я получаю сообщение об ошибке)

  • Как мне получить все, чтобы растянуть/перестроить себя в соответствии с дополнительным серым пространством?

Обновление 2 Мои файлы в этом проекте:

enter image description here

Обновление 3 Это текущий файл, над которым я работаю "FormTTS.java" Найдите "MAXIMIZED_BOTH" там, и вы найдете код, который, я думаю, вы захотите проверить.

Ответ 1

Обычно, насколько игры идут, предпочтительнее использовать полноэкранный режим вместо использования максимально развернутого окна. Вы можете сделать это на Java, используя:

GraphicsEnvironment gfxEnv = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gfxDev = gfxEnv.getDefaultScreenDevice();

Window window = new GameWindow();
gfxDev.setFullScreenWindow(window);

Если вы все еще хотите использовать обычный фрейм и центрировать панель содержимого, вам необходимо определить некоторые ограничения GridBagLayout. Невозможно определить, кто, не видя кода для остальных компонентов на этом экране, но подумайте о следующем:

  • GridBagConstraints.fill
  • GridBagConstraints.anchor
  • GridBagConstraints.weightx
  • GridBagConstraints.weighty

И, наконец, в отношении установки экрана на самый большой размер, он уже рассмотрен здесь: Размер Java JFrame в соответствии с разрешением экрана

Ответ 2

У меня также есть то же требование, что и у вас, ниже кода работает для меня.

Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(0,0,d.width,d.height); // i assume you have extended JFrame

Ответ 3

попробуйте это, надеюсь, что это сработает и для вас.

MyFrame mFrame= new MyFrame();
mFrame.setVisible(true);
mFrame.setExtendedState(mFrame.getExtendedState() | JFrame.MAXIMIZED_BOTH);

Ответ 4

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

Ответ 5

Пробовал ли вы этот код

JFrame frame = new JFrame();
frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
frame.setVisible(true);

Вы можете получить полный размер экрана любого устройства с помощью "Toolkit.getDefaultToolkit(). getScreenSize()" в java. Над кодом я установил размер кадра в полноэкранный режим.

int height = Toolkit.getDefaultToolkit().getScreenSize().height;
int width = Toolkit.getDefaultToolkit().getScreenSize().width;

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

Ответ 6

Вы можете легко позвонить

setExtendedState(MAXIMIZED_BOTH); в jframe или

используйте следующий код, чтобы установить размер экрана на любой ПК.

//размер экрана

 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

//высота панели задач

Insets scnMax = Toolkit.getDefaultToolkit().getScreenInsets(getGraphicsConfiguration());
    int taskBarSize = scnMax.bottom;

//доступный размер экрана

 setSize(screenSize.width, screenSize.height - taskBarSize);
    setLocation(screenSize.width - getWidth(), screenSize.height - taskBarSize - getHeight());

Если вы хотите, чтобы вы могли удалить размер панели задач, чтобы получить полный экран в любом случае, это код, и это поможет вам.

Ответ 8

если вы используете панель, тогда вы можете изменять размер в соответствии с панелью, она отображается в полном размере панели

yourinternalframe.setSize(mainPanel.getSize());
yourinternalframe.show();

это может показаться не вашей реальной потребностью, вы можете сделать что-то в соответствии с этим

Ответ 9

Я взглянул на код, который вы прикрепили для FormTTS.java. Я узнал, что ваш экран был настроен так, как использовать абсолютный макет, жестко закодированный для некоторых пикселей. Посмотрите на следующий код:

Menu.getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

Menu.getContentPane().add(jPanel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(420, 230, 530, 320));

Ваш JFrame не использует GridBagLayout, вместо этого он использует AbsoluteLayout из библиотеки Netbeans. Поэтому, я думаю, вы создали эти коды пользовательского интерфейса с помощью инструментов Netbeans.

И затем относительно вашего изображения, которое не заполняет весь экран при максимальном увеличении: jLabel9.setIcon(new javax.swing.ImageIcon(getClass().getResource("/freetts/equations.png")));

Menu.getContentPane().add(jLabel9, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 1530, 990));

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

Если вы хотите, чтобы все было сосредоточено, когда вы максимизировали свой экран, я думаю, что единственный способ сделать это - использовать макет gridbag для вашего JFrame, и это требует, чтобы вы обновили почти все в своем коде. И вам нужно будет полностью понять, как работает GridBagLayout. Вот где начать.

Однако, если вы хотите, чтобы фоновое изображение заполняло экран, вы можете выполнить следующие шаги, чтобы изображение масштабировалось, чтобы заполнить размер JLabel: Измените размер изображения в соответствии с JLabel

Если он все еще не работает, вы также должны получить размер экрана (из одного из ответов здесь), а затем установить prefferedSize из JLabel с этими значениями в дополнение к масштабированию изображения.

Ответ 10

Чтобы добавить ответ на @eitanfar, лучший способ включения полноэкранного режима в Java использует API-интерфейс FSEM (FullScreen Exclusive Mode).


Как он сказал, это достигается установкой окон как полноэкранного режима на GraphicsDevice, в котором вы хотите, чтобы окно отображалось в полноэкранном режиме, обычно по умолчанию. Даже если ваше устройство не поддерживает FSEM (id est isFullscreenSupported() возвращает false), установка окна в полноэкранном режиме будет по-прежнему частично работать, поскольку API будет эмулировать полноэкранный режим. Единственная проверка безопасности - проверить, является ли GraphicsEnvironment безголовым (isHeadless()). Если это так, то нет устройств для отображения.


Преимущество FSEM дает вам то, что вся графическая обработка запускается на графическом процессоре (GraphicsDevice - это графический процессор, а не монитор), что делает его более быстрым для большинства систем. В параметрах вашей программы вы можете разрешить пользователю включать или отключать FSEM, чтобы они могли работать с оптимальной производительностью.


Однако события системной перерисовки undefined, когда в FSEM вам лучше использовать активный рендеринг, поэтому вам лучше игнорировать repaint (setIgnoreRepaint(true)), а затем использовать пользовательский поток для рисования.

Ответ 11

У меня такая же проблема с моим приложением. ближайший я пришел, чтобы установить все компоненты, которые находятся сверху, либо на component.setOpaque(false), либо на component.setBackground(новый цвет (255,255,255,0)). вы также можете попробовать panel.setVisible(false) для неиспользуемых панелей. его трудно предложить код с всей программой, но дать этому вихрь:

Menu.setBackground(new Color(255,255,255,0);