请教关于图像绘制的问题。

afgkidy 2009-01-22 11:34:07
//ImageTest.java
import java.awt.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class ImageTest extends JFrame {

public static void main(String[] args) {

DisplayMode displayMode;

if (args.length == 3) {
displayMode = new DisplayMode(
Integer.parseInt(args[0]),
Integer.parseInt(args[1]),
Integer.parseInt(args[2]),
DisplayMode.REFRESH_RATE_UNKNOWN);
}
else {
displayMode = new DisplayMode(800, 600, 16,
DisplayMode.REFRESH_RATE_UNKNOWN);
}

ImageTest test = new ImageTest();
test.run(displayMode);
}

private static final int FONT_SIZE = 24;
private static final long DEMO_TIME = 3000;

private SimpleScreenManager screen;
private Image bgImage;
private Image opaqueImage;
private Image transparentImage;
private Image translucentImage;
private Image antiAliasedImage;
private boolean imagesLoaded;

public void run(DisplayMode displayMode) {
setBackground(Color.blue);
setForeground(Color.white);
setFont(new Font("Dialog", Font.PLAIN, FONT_SIZE));
imagesLoaded = false;

screen = new SimpleScreenManager();
try {
screen.setFullScreen(displayMode, this);
loadImages();
try {
Thread.sleep(DEMO_TIME);
}
catch (InterruptedException ex) { }
}
finally {
screen.restoreScreen();
}
}


public void loadImages() {
bgImage = loadImage("src/ch02src/images/background.jpg");
opaqueImage = loadImage("src/ch02src/images/opaque.png");
transparentImage = loadImage("src/ch02src/images/transparent.png");
translucentImage = loadImage("src/ch02src/images/translucent.png");
antiAliasedImage = loadImage("src/ch02src/images/antialiased.png");
imagesLoaded = true;
// signal to AWT to repaint this window
repaint();
}


private Image loadImage(String fileName) {
return new ImageIcon(fileName).getImage();
}


public void paint(Graphics g) {
// set text anti-aliasing
if (g instanceof Graphics2D) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
}

// draw images
if (imagesLoaded) {
g.drawImage(bgImage, 0, 0, null);
drawImage(g, opaqueImage, 0, 0, "Opaque");
drawImage(g, transparentImage, 320, 0, "Transparent");
drawImage(g, translucentImage, 0, 300, "Translucent");
drawImage(g, antiAliasedImage, 320, 300,
"Translucent (Anti-Aliased)");
System.out.println("drawImage");
}
else {
g.drawString("Loading Images...", 5, FONT_SIZE);
System.out.println("DrawString");
}
}


public void drawImage(Graphics g, Image image, int x, int y,
String caption)
{
g.drawImage(image, x, y, null);
g.drawString(caption, x + 5, y + FONT_SIZE +
image.getHeight(null));
}

}

//SimpleScreenManager.java

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

/**
The SimpleScreenManager class manages initializing and
displaying full screen graphics modes.
*/
public class SimpleScreenManager {

private GraphicsDevice device;

/**
Creates a new SimpleScreenManager object.
*/
public SimpleScreenManager() {
GraphicsEnvironment environment =
GraphicsEnvironment.getLocalGraphicsEnvironment();
device = environment.getDefaultScreenDevice();
}


/**
Enters full screen mode and changes the display mode.
*/
public void setFullScreen(DisplayMode displayMode,
JFrame window)
{
window.setUndecorated(true);
window.setResizable(false);

device.setFullScreenWindow(window);
if (displayMode != null &&
device.isDisplayChangeSupported())
{
try {
device.setDisplayMode(displayMode);
}
catch (IllegalArgumentException ex) {
// ignore - illegal mode for this device
}
}
}


/**
Returns the window currently used in full screen mode.
*/
public Window getFullScreenWindow() {
return device.getFullScreenWindow();
}


/**
Restores the screen's display mode.
*/
public void restoreScreen() {
Window window = device.getFullScreenWindow();
if (window != null) {
window.dispose();
}
device.setFullScreenWindow(null);
}

}
...全文
111 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zk20052009 2009-01-23
  • 打赏
  • 举报
回复
方便观察
把第一个程序修改了一下
图片load结束后
窗口每重绘一次,调用一次repaint
打印drawImage


import java.awt.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.imageio.*;
import java.io.*;

public class ImageTest extends JFrame {

public static void main(String[] args) {

DisplayMode displayMode;

if (args.length == 3) {
displayMode = new DisplayMode(
Integer.parseInt(args[0]),
Integer.parseInt(args[1]),
Integer.parseInt(args[2]),
DisplayMode.REFRESH_RATE_UNKNOWN);
}
else {
displayMode = new DisplayMode(800, 600, 16,
DisplayMode.REFRESH_RATE_UNKNOWN);
}

ImageTest test = new ImageTest();
test.setSize(800, 800);
test.setVisible(true);//调用repaint 此时图片还未load 打印DrawString
test.run(displayMode);//load完成 打印drawImage
}

private static final int FONT_SIZE = 24;
private static final long DEMO_TIME = 3000;

private SimpleScreenManager screen;
private Image bgImage;
private Image opaqueImage;
private Image transparentImage;
private Image translucentImage;
private Image antiAliasedImage;
private boolean imagesLoaded;

public void run(DisplayMode displayMode) {
setBackground(Color.blue);
setForeground(Color.white);
setFont(new Font("Dialog", Font.PLAIN, FONT_SIZE));
imagesLoaded = false;

screen = new SimpleScreenManager();
try {
//screen.setFullScreen(displayMode, this);
loadImages();
try {
Thread.sleep(DEMO_TIME);
}
catch (InterruptedException ex) { }
}
finally {
//screen.restoreScreen();
}
}


public void loadImages() {
try{
bgImage = ImageIO.read(new File("01.jpg"));
opaqueImage = ImageIO.read(new File("02.png"));
transparentImage = ImageIO.read(new File("03.png"));
translucentImage = ImageIO.read(new File("04.png"));
antiAliasedImage = ImageIO.read(new File("05.png"));
imagesLoaded = true;
// signal to AWT to repaint this window
repaint();
}
catch(IOException e){e.printStackTrace();}
}


//private Image loadImage(String fileName) {
// return new ImageIcon(fileName).getImage();
//}


public void paint(Graphics g) {
// set text anti-aliasing
if (g instanceof Graphics2D) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
}

// draw images
if (imagesLoaded) {
g.drawImage(bgImage, 0, 0, null);
drawImage(g, opaqueImage, 0, 0, "Opaque");
drawImage(g, transparentImage, 320, 0, "Transparent");
drawImage(g, translucentImage, 0, 300, "Translucent");
drawImage(g, antiAliasedImage, 320, 300,
"Translucent (Anti-Aliased)");
System.out.println("drawImage");
}
else {
g.drawString("Loading Images...", 5, FONT_SIZE);
System.out.println("DrawString");
}
}


public void drawImage(Graphics g, Image image, int x, int y,
String caption)
{
g.drawImage(image, x, y, null);
g.drawString(caption, x + 5, y + FONT_SIZE +
image.getHeight(null));
}

}
chen2319 2009-01-23
  • 打赏
  • 举报
回复
楼下的继续解答》
zk20052009 2009-01-23
  • 打赏
  • 举报
回复
你的图片load完之后
每刷新一次就会打印一次drawImage
afgkidy 2009-01-22
  • 打赏
  • 举报
回复
问题1:
paint调用了3次,console打印如下:
DrawString
DrawString
drawImage
调用3次。

DrawString
DrawString
drawImage
drawImage
drawImage
调用5次。
如何调用多次的。

问题2:
我显示器是1280×1024的
我改displayMode = new DisplayMode(800, 600, 16,
DisplayMode.REFRESH_RATE_UNKNOWN);
displayMode = new DisplayMode(1280, 1024, 16,
DisplayMode.REFRESH_RATE_UNKNOWN);
图片显示反而变小了,这个地方怎么控制的?

afgkidy 2009-01-22
  • 打赏
  • 举报
回复
求救啊

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧