JPanels, Jframes и Windows, о боже!
-
16-09-2019 - |
Вопрос
Просто заявил, что я пытаюсь сделать игру, над которой я работаю над полноэкранным.
У меня есть следующий код, который я пытаюсь использовать:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
if(!gs.isFullScreenSupported()) {
System.out.println("full-screen not supported");
}
Frame frame = new Frame(gs.getDefaultConfiguration());
Window win = new Window(frame);
try {
// Enter full-screen mode
gs.setFullScreenWindow(win);
win.validate();
}
Проблема с этим в том, что я работаю в классе, который расширяет JPanel, и, хотя у меня есть переменная кадра типа, у меня нет окна типа в классе.
Мое понимание JPanel в том, что это своего рода окно, но я не могу передать это «в Gs.setfullScreenWindow (победа в окне) ... как мне это сделать?
Есть ли простой способ вызвать это или аналогичный метод, используя JPanel?
Есть ли способ получить что -нибудь из окна типа от моего JPanel?
-
Изменить: следующий метод меняет состояние jframe и называется каждые 10 мс:
public void paintScreen()
{
Graphics g;
try{
g = this.getGraphics(); //get Panel's graphic context
if(g == null)
{
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setExtendedState(frame.getExtendedState()|JFrame.MAXIMIZED_BOTH);
frame.add(this);
frame.pack();
frame.setResizable(false);
frame.setTitle("Game Window");
frame.setVisible(true);
}
if((g != null) && (dbImage != null))
{
g.drawImage(dbImage, 0, 0, null);
}
Toolkit.getDefaultToolkit().sync(); //sync the display on some systems
g.dispose();
}
catch (Exception e)
{
if(blockError)
{
blockError = false;
}
else
{
System.out.println("Graphics context error: " + e);
}
}
}
Я ожидаю, что может быть несколько избыточных или ненужных вызовов после заявления IF (g == null) (все кадры.
Кроме того, ошибка блока - это то, что кажется. Я игнорирую ошибку. Ошибка возникает только один раз, и это работает нормально при настройке, чтобы игнорировать первый экземпляр ошибки ... Для всех, кто заинтересован, я могу опубликовать там дополнительную информацию, если кто -то хочет посмотреть, можно ли удалить этот блок, но я не обеспокоен ... Я мог бы посмотреть на это позже.
Решение
Вы добились успеха в этой проблеме? Это может быть полезно, если бы вы могли обновить свой вопрос своим ожидаемым поведением и что на самом деле делает код? Как уже отмечалось, JFrame - это подкласс окна, поэтому, если у вас есть JFrame, вам не нужно окно.
Для того, что это стоит, у меня есть приложение Java, которое работает в полноэкранном режиме. Хотя экран не перекрашивается так часто, как ваш, он регулярно перекрашивается. Я делаю следующее, чтобы ввести полноэкранное:
// pseudo-code; not compilable
JPanel container = new JPanel();
container.setOpaque( true ); // make sure the container will be visible
JFrame frame = new JFrame();
frame.getContentPane().add(container); // add the container to the frame
frame. ... //other initialization stuff, like default close operation, maximize, etc
if ( fullScreenModeIsSupported )
frame.setUndecorated( true ); // remove window decorations from the frame
gs.setFullScreenWindow( frame );
frame.validate();
Затем, когда мне нужно обновить экран, я просто подключаю новую JPanel в container
JPanel:
// pseudo-code; not compilable
container.removeAll(); // clean out the container
container.add( jPanelWithNewDisplay ); // add the new display components to the container
container.validate(); // update and redisplay
container.repaint();
Не могу утверждать, что это технически идеально, но это хорошо работает для меня. Если примеры псевдокода не сокращают его, я могу потратить некоторое время на составление компилябельного примера.
Другие советы
Я думаю, что получил то, что вам нужно.
Установите рамку неоснованным, так что он поступает без какого -либо панели заголовка и прочего.
Добавьте свою панель в кадр., Так что выглядит так, будто отображается только ваша панель.
Максимизируйте свой кадр. Так что теперь должно выглядеть так, как будто ваша панель принимает полный экран без и оконных вещей.
Frame.Setundecorated (True); Frame.add (панель); // теперь максимизируйте вашу кадр.
Примечание: Важно отметить, что нежественный API может быть вызван только тогда, когда ваш кадр не поддается игре, поэтому, если он уже покажет, то сначала вам нужно сделать SetVisible (false).
РЕДАКТИРОВАТЬ1: Если все, что вам нужно, это получить окно, содержащее вашу панель, то вы можете сделать это:
Window win = SwingUtilities.getAncestorOfClass(Window.class, myPanel);
Как только вы получите экземпляр окна, вы можете пройти его везде, где захотите.
Edit2: Так же Frame
класс расширяется Window
так что вы можете прямо сделать gs.setFullScreen(frame)
. Анкет Вам не нужно создавать новое окно для этого кадра.
Мое понимание JPanel в том, что это своего рода окно
Почему ты так думаешь? Вы читали API? JPanel простирается из окна?
Вы можете попробовать использовать класс SwingUtilities. У него есть метод, который возвращает окно для данного компонента.