Java - экран становится черным, когда JFrame установлен в полноэкранный режим - PullRequest
1 голос
/ 10 марта 2012

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

Рисование непосредственно на 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 dm, окно 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 в полноэкранном режиме?

Ответы [ 3 ]

3 голосов
/ 11 марта 2012

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

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

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

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

2) Связанный графический интерфейс Swing должен быть заключен в invokeLater(), что означает

public static void main(String[] args){

больше в Начальная нить

3) в примере связанного кода вы можете узнать, как использовать фоновую нить в Swing

0 голосов
/ 26 октября 2013

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

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 голосов
/ 11 марта 2012

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

...