如何获得 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
的容器,其中包含contentPane
、JMenuBar
和JGlassPane
当你覆盖像 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 获取图像绘画并添加全屏支持。这使您可以在一组孤立的功能中解决问题,从而更容易解决。
我正在尝试使用图形在屏幕上显示图像,但屏幕未加载
输出屏幕出现但只显示黑屏而不显示图像
代码编译正确,为什么我没有得到输出
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
的容器,其中包含contentPane
、JMenuBar
和JGlassPane
当你覆盖像 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 获取图像绘画并添加全屏支持。这使您可以在一组孤立的功能中解决问题,从而更容易解决。