0

我正在尝试使用绘画方法创建全屏。我希望显示带有蓝色背景的粉红色“今天是这一天”。问题是,当我运行我的程序时,它会显示我使用工具栏和应用程序在屏幕上绘制的内容,而不是显示蓝色背景,中间是粉红色的“今天是这一天”。一些代码如下。

public static void main(String args[])
{
    DisplayMode dm1 =
        new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN);
    RunScreen runProgram = new RunScreen();
    runProgram.run(dm1);
}

public void run(DisplayMode dm)
{
    getContentPane().setBackground(Color.BLUE);
    setForeground(Color.PINK);

    setFont(new Font("Arial", Font.PLAIN, 24));

    FullScreen s = new FullScreen();
    try
    {
        s.setFullScreen(dm, this);

        try
        {
            Thread.sleep(5000);
        }
        catch (Exception e)
        {

        }

    }
    finally
    {
        s.restoreScreen();
    }

}

@Override
public void paint(Graphics g)
{

    g.drawString("This is the day", 200, 200);

}
4

4 回答 4

2
Thread.sleep(5000);

不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用实现重复任务Thread.sleep(n)的 Swing或长时间运行的任务。有关更多详细信息,请参阅Swing 中的并发。TimerSwingWorker

于 2013-05-19T08:41:37.453 回答
1

这似乎工作得很好......

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestFullScreen {

    public static void main(String[] args) {
        new TestFullScreen();
    }

    public TestFullScreen() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setUndecorated(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
                device.setFullScreenWindow(frame);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); 
            String text = "Hello";
            FontMetrics fm = g.getFontMetrics();
            int x = (getWidth() - fm.stringWidth(text)) / 2;
            int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
            g.drawString(text, x, y);
        }        
    }    
}

请注意,您请求制作成全屏窗口的“窗口”可能不是系统实际使用的窗口。

您应该避免覆盖paintpaintComponent改为使用。您还应该避免覆盖paint顶级容器(如JFrame)。

查看在 AWT 和 Swing中执行自定义绘画和绘画以了解更多详细信息...

于 2013-05-19T09:26:31.337 回答
1

隐藏工具栏等。使用setUndecorated

runProgram.setUndecorated(true);
runProgram.run(dm1);

要以粉色显示中间带有“今天是这一天”的蓝色背景,请将颜色设置为paint(或paintComponent

g.setColor(Color.BLUE);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.PINK);
g.drawString("This is the day", 200, 200);

其次,您不应该在 EDT(事件调度线程)之外使用 GUI。你应该这样做:

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        setFont(new Font("Arial", Font.PLAIN, 24));
    }
});

第三,您不应该覆盖paint顶级容器。(我不是指@Override符号)。你应该像安德鲁汤普森提到的那样做:

于 2013-05-19T08:54:56.897 回答
0

帧全屏时不输入重绘方法。所以这种方式对于重绘swing JFrame很有用。

public void actionPerformed(ActionEvent arg0) {
    if (getExtendedState() == 6) {//6 full-screen, 0 normal, -1 minimized
        repaint();
    } else {
        repaint();
    }
}
于 2019-12-01T18:00:42.973 回答