2012-03-10 4 views
2

Я пытаюсь нарисовать что-то на холсте, добавить его в JFrame, а затем установить этот JFrame в полноэкранный режим. Моя проблема: в полноэкранном режиме я вижу только черный экран. Прежде чем экран станет черным, я вскоре увижу розовый фон холста.Java - Экран становится черным при настройке JFrame на Fullscreen

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

Вот мой код:

public class FullscreenTest extends Canvas { 

    private JFrame mainFrame; 

    public FullscreenTest(){ 
     this.mainFrame = new JFrame(); 
     JPanel contentPane = (JPanel) mainFrame.getContentPane(); 
     contentPane.add(this); 
    } 

    public void run(DisplayMode dm){ 
     setBackground(Color.PINK); 
     setForeground(Color.WHITE); 
     setFont(new Font("Arial", Font.PLAIN, 24)); 

     Screen s = new Screen(); 

     s.setFullScreen(dm, this.mainFrame); 

     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException exc) { exc.printStackTrace(); } 

     s.closeFullScreenWindow(); 
    } 

    public void paint(Graphics g){  
     g.drawString("This is some testtext", 200, 200); 
    } 

    public static void main(String[] args){ 
     DisplayMode dm = new DisplayMode(800, 600, 32, DisplayMode.REFRESH_RATE_UNKNOWN); 
     FullscreenTest test = new FullscreenTest(); 
     test.run(dm); 
    } 
} 

Вот что Screen.setFullScreen (DisplayMode дм, JFrame окно) делает метод:

//graphicsDevice = GraphicsEnvironment.getLocalGraphicsEnvironment() 
//     .getDefaultScreenDevice(); 
public void setFullScreen(DisplayMode dm, JFrame window){ 
    window.setUndecorated(true); 
    window.setResizable(false); 
    graphicsDevice.setFullScreenWindow(window); 

    if(dm != null && graphicsDevice.isDisplayChangeSupported()){ 
     graphicsDevice.setDisplayMode(dm);   
    } 
} 

Кто-нибудь есть ключ, почему я не см. содержание JFrame в полноэкранном режиме?

+0

Вызывается ли вызов this.mainFrame.repaint() сразу после вызова setFullScreen(), в чем разница? Мне интересно, если переключение на полноэкранное сбрасывание бит, но оно не понимает, что нужно перерисовать. – JTeagle

+0

Это, к сожалению, ничего не меняет. Пока экран переключается в полноэкранный режим, я коротко вижу розовый фон холста, пока экран не станет черным (даже без перерисовки()). – 1Q91

+0

На самом деле, думая об этом, я думаю, что проблема заключается в том, что текущий поток спящий - потому что текущий поток - это поток пользовательского интерфейса, поэтому вы фактически приостанавливаете поток пользовательского интерфейса и не позволяете ему продолжать работать. Попробуйте взять Thread.sleep() из этого класса и поместите его в свой main() после вызова run(), а затем добавьте отдельный метод, чтобы снова свернуть окно. Таким образом, сон находится в потоке приложения, а не в потоке пользовательского интерфейса, если у меня правильная теория потоков. – JTeagle

ответ

3

1) у вас есть три общие вопросы

  • не блокировать EDT с помощью Thread.sleep(5000); использовать Swing Timer вместо демонстрации here

  • (если не есть действительно важные причины) не смешивая AWT with Swing остальное here, и использовать JPanel вместо Canvas (для Canvas есть paint метод, для JPanel есть paintComponent)

  • ваш public void paint(Graphics g){ является в JFrame вместо Canvas и заблокирован Thread.sleep(5000);

2) Качели GUI rellated должны быть обернуты в invokeLater() означает более

public static void main(String[] args){ 

в Initial Thread

3) in linked code example Вы c поиск демостраций, как использовать фоновый поток в Swing

+0

Для справки, есть пример [здесь] (http://stackoverflow.com/a/7457102/230513). – trashgod

0

Я согласен с mKorbel (на самом деле, у меня есть код, который работает с исправлениями, которые он предлагает). Только один намек на достижение более предсказуемых результатов: возьмите контроль над цветами в методе paint(). Цвет по умолчанию для фона может отличаться для разных систем. В моей системе он рисует белый текст на светло-красном фоне. Но если начернет черный текст на черном фоне, тест будет выглядеть как «не работает».

0

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

public void paint(Graphics g){  
     g.drawString("This is some testtext", 200, 200); 
    } 

все, что вам нужно сделать, это использовать «супер»

public void paint(Graphics g){ 
     super.paint(g); 
     g.drawString("This is some testtext", 200, 200); 
    } 

Я пробовал это сам, и он работает нормально.

+0

super использует все методы в суперклассе и применяет его. – Ayman