//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.javaimport 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);
    }}

解决方案 »

  1.   

    问题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);
    图片显示反而变小了,这个地方怎么控制的?
      

  2.   

    你的图片load完之后
    每刷新一次就会打印一次drawImage
      

  3.   

    方便观察
    把第一个程序修改了一下
    图片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));
        }}