4

私は2つのクラスファイルを持っています:

画面https://gist.github.com/3020101

JMain https://gist.github.com/3020107

私はそれを5秒間全画面表示にして背景(または、この時点で前景も)を表示しようとしていますが、実行すると5秒間全画面表示になりますが、空白の明るい灰色です画面。

私は何を間違っていますか?最終的には背景に画像を使用する予定で、どこかで失敗していないことを確認したいと考えています。

みんなありがとう!

編集: JMain クラスの最後にこれを追加すると、フォントの色は前景色と同じですが、プログラムでどの色に変更しても背景は常に黒になります。

public void paint(Graphics g) {
    g.drawString("This is gonna be awesome", 200, 200);
}

コードは github から

import java.awt.*;
import javax.swing.JFrame;

public class JMain extends JFrame {

    private JFrame frame = new JFrame();

    public static void main(String[] args) {
        DisplayMode dm = new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN);
        JMain m = new JMain();
        m.run(dm);
    }

    public void run(DisplayMode dm) {
        this.getContentPane().setBackground(Color.RED);
        frame.setForeground(Color.BLACK);
        frame.setFont(new Font("Arial", Font.PLAIN, 24));
        Screen s = new Screen();
        try {
            s.setFullScreen(dm, this);
            try {
                Thread.sleep(5000);
            } catch (Exception ex) {
            }
        } finally {
            s.restoreScreen();
        }
    }
}

import java.awt.*;
import javax.swing.JFrame;

public class Screen {

    private GraphicsDevice vc;

    public Screen() {
        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        vc = env.getDefaultScreenDevice();
    }

    public void setFullScreen(DisplayMode dm, JFrame window) {
        window.setUndecorated(true);
        window.setResizable(false);
        vc.setFullScreenWindow(window);
        if (dm != null && vc.isDisplayChangeSupported()) {
            try {
                vc.setDisplayMode(dm);
            } catch (Exception ex) {
            }
        }
    }

    public Window getFullScreenWindow() {
        return vc.getFullScreenWindow();
    }

    public void restoreScreen() {
        Window w = vc.getFullScreenWindow();
        if (w != null) {
            w.dispose();
        }
        vc.setFullScreenWindow(null);
    }
}
4

2 に答える 2

11
  1. を拡張せずJFrame、代わりにローカルJFrame変数を作成して使用します。

  2. の背景色をペイントすることはできませんJFrameが、JFrame contentPane(通常はJPanel) に対してはこれを行うことができます。これを行うコードの例は次のとおりです。

    this.getContentPane().setBackground(Color.RED);

  3. Swing イベント スレッドで呼び出されるコードでは絶対に使用Thread.sleep(int)しないでください。これにより、このスレッドが完全にブロックされ、GUI の描画やユーザーとのやり取りなどの必要なアクションを実行できなくなり、スレッドがスリープしている間はアプリケーションが効果的にフリーズします。

  4. 代わりにスイングタイマーを使用する Thread.sleep(...)

于 2012-06-29T20:45:58.443 に答える
6

交換:

setBackground(Color.RED);

と:

getContentPane().setBackground(Color.RED);

これとは別に、グラフィックス関連のコードをSwingUtilities.invoke ...に配置してみてください。グラフィックス関連のクラスをメインスレッドから使​​用すると、予期しない問題が発生する可能性があります。この変更を行う場合は、SwingUtilities.invoke...内でのスリープを回避してください。ペイントがブロックされます。

于 2012-06-29T20:43:43.253 に答える