如何获得 Java 输出屏幕?

How to get the Java Output screen?

我正在尝试使用图形在屏幕上显示图像,但屏幕未加载

输出屏幕出现但只显示黑屏而不显示图像

代码编译正确,为什么我没有得到输出

package game;

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 resotreScreen(){
        Window w= vc.getFullScreenWindow();
        if(w!=null){
            w.dispose();
        }
        vc.setFullScreenWindow(null );
    }


}



package game;

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

import javax.swing.JFrame;

class Images extends JFrame{
    public static void main(String[] args){
       DisplayMode dm = new DisplayMode(800,600,16,DisplayMode.REFRESH_RATE_UNKNOWN);

       Images i = new Images();
       i.run(dm);

    }

    private Screen s;
    private Image bg;
    private Image pic;
    private boolean loaded;
    public void run(DisplayMode dm){
        setBackground(Color.BLUE);
        setForeground(Color.WHITE);
        setFont(new Font("Arial",Font.PLAIN,24));

        loaded =false;

        s = new Screen();

        try{
            s.setFullScreen(dm, this);
            loadpics();
            try{
                Thread.sleep(10000);
            }catch(Exception ex){}
        }finally{
               s.resotreScreen();
        }

    }

    public void loadpics(){
        bg = new ImageIcon("C:\Users\Dhruv\Downloads\Ronaldo.jpg").getImage();
        pic =new ImageIcon("C:\Users\Dhruv\Downloads\Messi.jpg").getImage();

        loaded= true;
        repaint();
    }
    public void paint(Graphics g){
        if(g instanceof Graphics2D){
            Graphics2D g2 =(Graphics2D)g;
            g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        }

        if(loaded){
            g.drawImage(bg,0,0,null);
            g.drawImage(pic,170,180,null);
        }

    }
}

让我们从背景信息开始...

一个JFrame是一个JRootPane的容器,其中包含contentPaneJMenuBarJGlassPane

当你覆盖像 JFrame 这样的顶层容器的 paint 时,你只是在绘制最底部的组件,JRootPane 然后它的内容被绘制在顶部,使得这有点毫无意义。

有关详细信息,请参阅 How to Use Root Panes

绘画也是一个复杂的操作,调用失败super.paint会导致无穷无尽的问题,确保在绘画之前总是调用超级绘画方法,除非你真的了解它的工作原理并准备这样做这是手动工作。

在 Swing 中,我们鼓励您从基于 JComponent 的 class(JPanel 是首选)进行扩展,并覆盖其 paintComponent 方法并执行您的自定义绘制那里

此组件可以添加到 window 或设置为 contentPane 或添加到其他容器,具体取决于您的需要。

有关详细信息,请参阅 Painting in AWT and Swing and Performing Custom Painting

ImageIcon 使用后台线程加载它的图像,因此即使它 returns,图像也可能无法实现(或完全加载)。当您使用 g.drawImage(bg,0,0,null);,将 null 作为 ImageObserver 传递时,它会阻止容器知道图像何时更改并允许它自动重绘自己。

很棒的是,所有基于 Component 的 classes 实现 ImageObserver,所以几乎任何可以绘画的东西都可以充当 ImageObserver

约定将鼓励通过 this 作为 ImageObserver

通常,更好的解决方案是使用 ImageIO,它在加载图像时不会 return,直到图像完全实现。

查看 Reading/Loading an Image 了解更多详情。

Thread.sleep(10000); 在 Swing 中使用是一件危险的事情。它有可能阻止 UI 更新或响应其他输入和事件,使您的程序看起来好像已挂起,因为它已经挂起。但在你的情况下,这意味着你违反了 Swing 的单线程规则。

Swing 是一个单线程环境,你不应该执行任何可能阻塞事件调度线程的操作,你也不应该从 EDT 上下文之外更新 UI。

有一些解决方案可以帮助您,Swing Timer 用于生成在 EDT 内调度的周期性事件,SwingWorker 用于执行长 运行 操作,支持更新UI.

有关详细信息,请参阅 The Event Dispatch Thread

我的建议是不要担心全屏支持,专注于使用正常 window 获取图像绘画并添加全屏支持。这使您可以在一组孤立的功能中解决问题,从而更容易解决。