【问题标题】:How to get the Java Output screen?如何获得 Java 输出屏幕?
【发布时间】:2023-03-11 00:21:01
【问题描述】:

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

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

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

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);
        }

    }
}

【问题讨论】:

  • 首先查看Performing Custom PaintingPainting in AWT and Swing,了解有关如何在Swing 中进行绘画的更多详细信息。提示,不要覆盖顶级容器的paint
  • Thread.sleep(10000); 毫无意义,因为它有能力阻止 UI 被绘制。
  • 我的建议是,不要担心全屏模式,先让它在普通窗口下工作,然后实现全屏支持
  • 我有点奇怪,人们投票关闭它,因为没有提供可运行的示例,是否有人实际上将代码复制到 IDE 并尝试运行它?我的意思是,它为我编译

标签: java swing awt


【解决方案1】:

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

JFrameJRootPane 的容器,其中包含contentPaneJMenuBarJGlassPane

当您覆盖 JFrame 等顶级容器的 paint 时,您只会绘制最底部的组件,JRootPane,然后将其内容绘制在顶部,使其毫无意义。

详情请见How to Use Root Panes

绘画也是一个复杂的操作,不调用super.paint会导致无穷无尽的问题,请确保在绘画之前始终调用超级绘画方法,除非您真正了解它的工作原理并准备手动完成它的工作。

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

此组件可以添加到窗口中,也可以设置为contentPane,或者根据您的需要添加到其他容器中。

请参阅Painting in AWT and SwingPerforming Custom Painting 了解更多详情。

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

很酷的是,所有基于Component 的类都实现了ImageObserver,所以几乎任何可以绘制的东西都可以充当ImageObserver

约定鼓励将this 传递为ImageObserver

一般来说,更好的解决方案是使用ImageIO,它在加载图像时,在图像完全实现之前不会返回。

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

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

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

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

更多详情请见The Event Dispatch Thread

我的建议是不要担心全屏支持,专注于使用普通窗口绘制图像并添加全屏支持。这使您可以在一组独立的功能中解决问题,从而更容易解决。

【讨论】:

  • 哦,真是令人惊讶,又一次不请自来的反对票,因为没有提供新的答案,也没有新的反对票或接近投票反对这个问题,我只能假设你个人不喜欢我,除非你能提供一些帮助来解释为什么你会发现我的答案是客观的,否则什么都不会改变
猜你喜欢
  • 2010-12-28
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2014-03-27
  • 2013-04-17
相关资源
最近更新 更多