Java 一些图像无法';I don’我不能马上画

Java 一些图像无法';I don’我不能马上画,java,image,swing,awt,Java,Image,Swing,Awt,我是Java GUI编程新手。下面的代码就是我简化的问题 单击面板时会绘制两个图像。一个是使用drawVrImage()方法绘制的红框,另一个是使用drawrealmimage()方法绘制的红星。所有图像中的两个是沿着增加的行绘制的 以下是结果图像: 点击5次后显示。但是问题是drawRealImage()只绘制了4次图像,即使调用了5次。第一个红盒子在哪里?为什么buffereImage无法显示第一个红色框 GUI类仅用于加载图像。所有图像在启动时加载并放置HashMap。所以,我认为图像加

我是Java GUI编程新手。下面的代码就是我简化的问题

单击面板时会绘制两个图像。一个是使用
drawVrImage()
方法绘制的红框,另一个是使用
drawrealmimage()
方法绘制的红星。所有图像中的两个是沿着增加的行绘制的

以下是结果图像:

点击5次后显示。但是问题是
drawRealImage()
只绘制了4次图像,即使调用了5次。第一个红盒子在哪里?为什么
buffereImage
无法显示第一个红色框

GUI
类仅用于加载图像。所有图像在启动时加载并放置
HashMap
。所以,我认为图像加载(
Qwirkle.getImage()
)不是问题。我认为缓冲图像并没有图像观察者是个问题。但如果真的有问题的话。我怎样才能画第二个红盒子

供您参考。下面是代码解释。类
BIsource
有一个
buffeImage
。当我单击
UserPanel
时<
BIsource
中的code>buffereImage获取其图形并绘制图像。完成绘制图像后,
UserPanel
从BIsource获取该图像。并调用
reapint()
方法<
UserPanel
中的code>paintCompent()

我怎样才能解决这个问题

用户面板类

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.util.HashMap;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class UserPanel extends JPanel implements MouseListener {

    private BIsource draw;
    private BufferedImage bi;
    
    public UserPanel() {

        this.draw = new BIsource();
        this.bi = draw.getBI();
        this.addMouseListener(this);
    }

    @Override
    protected void paintComponent(Graphics g) {
        // TODO Auto-generated method stub
        g.drawImage(bi, 0, 0, this);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        this.draw.drawVrImage();
        this.draw.drawRealImage();
        this.draw.incIndex();
        bi = this.draw.getBI();
        this.repaint();
    }

    class BIsource {

        private BufferedImage biCanvas;

        private HashMap<String, BufferedImage> imageMap;

        private int index = 0;

        public BIsource() {

            // biCanvas Declaration
            biCanvas = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB_PRE);
            Graphics g = biCanvas.createGraphics();
            g.setColor(Color.blue);
            g.fillRect(0, 0, 500, 500);
            g.dispose();

            imageMap = new HashMap<>();
            this.createVrImage();
        }

        private void createVrImage() {
            BufferedImage vrImage = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB_PRE);
            Graphics g = vrImage.createGraphics();
            g.setColor(Color.red);
            g.fillRect(0, 0, 50, 48);
            g.dispose();

            this.imageMap.put("TEST IMAGE", vrImage);
        }

        public BufferedImage getBI() {
            return this.biCanvas;
        }

        public void drawVrImage() {
            Graphics g = biCanvas.createGraphics();
            g.drawImage(this.imageMap.get("TEST IMAGE"), 0, index * 50, null);
            g.dispose();
        }

        public void drawRealImage() {
            Graphics g = biCanvas.getGraphics();
            g.drawImage(Qwirkle.getImage("RED STAR"), 200, index * 50, null);
            g.dispose();
        }

        public void incIndex() {
            index += 1;
        }
    }
    
    public static void main(String[] args) {

        Qwirkle.loadQwirkleImage();

        JFrame mainFrame = new JFrame("Test Frame");
        mainFrame.setLayout(null);
        mainFrame.setSize(500, 500);
        mainFrame.setVisible(true);
        mainFrame.setBackground(Color.black);
        mainFrame.setLocation(800, 400);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        UserPanel userPanel = new UserPanel();
        mainFrame.add(userPanel);
        userPanel.setSize(500, 500);
        userPanel.setVisible(true);

    }
    

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.image.buffereImage;
导入java.util.HashMap;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类UserPanel扩展JPanel实现MouseListener{
私人双源提取;
私有缓冲映像bi;
公共用户面板(){
this.draw=new BIsource();
this.bi=draw.getBI();
这个。addMouseListener(这个);
}
@凌驾
受保护组件(图形g){
//TODO自动生成的方法存根
g、 drawImage(bi,0,0,this);
}
@凌驾
公共无效mouseClicked(MouseEvent e){
this.draw.drawVrImage();
this.draw.drawRealImage();
this.draw.incIndex();
bi=this.draw.getBI();
这个。重新绘制();
}
类双源{
私有缓冲区映像biCanvas;
私有HashMap-imageMap;
私有整数指数=0;
公共BIsource(){
//比坎瓦斯宣言
biCanvas=新的BuffereImage(500500,BuffereImage.TYPE_INT_ARGB_PRE);
Graphics g=biCanvas.createGraphics();
g、 setColor(Color.blue);
g、 fillRect(0,0500500);
g、 处置();
imageMap=newhashmap();
这个.createVrImage();
}
私有void createVrImage(){
BuffereImage vrImage=新的BuffereImage(50,50,BuffereImage.TYPE_INT_ARGB_PRE);
Graphics g=vrImage.createGraphics();
g、 setColor(Color.red);
g、 fillRect(0,0,50,48);
g、 处置();
this.imageMap.put(“测试图像”,vrImage);
}
公共缓冲区映像getBI(){
把这个还给我。比坎瓦斯;
}
公共图像(){
Graphics g=biCanvas.createGraphics();
g、 drawImage(this.imageMap.get(“测试图像”),0,索引*50,null);
g、 处置();
}
public void drawRealImage(){
Graphics g=biCanvas.getGraphics();
g、 drawImage(Qwirkle.getImage(“红星”),200,索引*50,空值);
g、 处置();
}
索引中的公共无效(){
指数+=1;
}
}
公共静态void main(字符串[]args){
loadQwirkleImage();
JFrame mainFrame=新JFrame(“测试帧”);
mainFrame.setLayout(空);
大型机。设置大小(500500);
mainFrame.setVisible(true);
主机。背景(颜色。黑色);
主机设置位置(800400);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
UserPanel UserPanel=新的UserPanel();
mainFrame.add(用户面板);
userPanel.setSize(500500);
setVisible(true);
}
@凌驾
公共无效mouseenterned(MouseEvent e){}
@凌驾
公共无效mouseExited(MouseEvent e){}
@凌驾
public void mousePressed(MouseEvent e){}
@凌驾
公共无效MouseEvent e{}
}
Qwirkle类

import java.awt.Image;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Random;

public class Qwirkle implements Serializable {

    private static HashMap<String, Image> qwirkleImages;

    // static initialize
    static {

    }

    public enum Color {
        CYAN, GREEN, ORANGE, PURPLE, RED, YELLOW
    }

    public enum Shape {
        CIRCLE, CLOVER, DIAMOND, RECTANGLE, STAR, URCHIN
    }

    private final Color color;
    private final Shape shape;
    private final int index;

    public Qwirkle(Color color, Shape shape, int index) {

        this.color = color;
        this.shape = shape;
        this.index = index;
    }

    public static void loadQwirkleImage() {

        if (Qwirkle.qwirkleImages == null) {
            Qwirkle.qwirkleImages = new HashMap<>();
                String key;
                try {
                    for (Qwirkle.Color color : Qwirkle.Color.values()) {
                        for (Qwirkle.Shape shape : Qwirkle.Shape.values()) {
                            key = new String(color.toString() + " " + shape.toString());
                            Qwirkle.qwirkleImages.put(key, GUI.loadImage(key + ".jpg"));
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
        } else {
            System.err.println("Already Loading all Qwirkle Image");
        }
    }

    public static Image getImage(String key) {
        return qwirkleImages.get(key);
    }

    synchronized public String getKey() {
        return new String(color.toString() + " " + shape.toString());
    }

    @Override
    public String toString() {
        return new String(color.toString() + " " + shape.toString() + " " + index);
    }

    public Color getColor() {
        return color;
    }

    public Shape getShape() {
        return shape;
    }
    
    
}
导入java.awt.Image;
导入java.io.Serializable;
导入java.util.HashMap;
导入java.util.Random;
公共类Qwirkle实现了可序列化{
私有静态HashMap qwirkleImages;
//静态初始化
静止的{
}
公共枚举颜色{
青色、绿色、橙色、紫色、红色、黄色
}
公共枚举形状{
圆形、三叶草、钻石、矩形、星形、海胆
}
私人最终颜色;
私人最终形状;
私有最终整数指数;
公共Qwirkle(颜色、形状、整数索引){
这个颜色=颜色;
这个形状=形状;
这个指数=指数;
}
公共静态void loadQwirkleImage(){
if(Qwirkle.qwirkleImages==null){
Qwirkle.qwirkleImages=新HashMap();
字符串键;
试一试{
对于(Qwirkle.Color:Qwirkle.Color.values()){
对于(Qwirkle.Shape Shape:Qwirkle.Shape.values()){
key=新字符串(color.toString()+“”+shape.toString());
Qwirkle.qwirkleImages.put(key,GUI.loadImage(key+“.jpg”);
}
}
}捕获(例外e){
e、 printStackTrace();
}
}否则{
系统
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.util.HashMap;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class UserPanel extends JPanel implements MouseListener {

    private BIsource draw;
    private BufferedImage bi;

    public UserPanel() {

        this.draw = new BIsource();
        this.bi = draw.getBI();
        this.addMouseListener(this);
    }

    @Override
    protected void paintComponent(Graphics g) {
        // TODO Auto-generated method stub
        g.drawImage(bi, 0, 0, this);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        this.draw.drawVrImage();
        this.draw.drawRealImage();
        this.draw.incIndex();
        bi = this.draw.getBI();
        this.repaint();
    }

    class BIsource {

        private BufferedImage biCanvas;
//      private HashMap<String, Image> qwirkleImages;
        private HashMap<String, BufferedImage> qwirkleImages;
        private HashMap<String, BufferedImage> imageMap;

        private int index = 0;

        public BIsource() {
            this.qwirkleImages = new HashMap<>();
            this.loadAllImage();

            // biCanvas Declaration
            biCanvas = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB_PRE);
            Graphics g = biCanvas.createGraphics();
            g.setColor(Color.blue);
            g.fillRect(0, 0, 500, 500);
            g.dispose();

            imageMap = new HashMap<>();
            this.createVrImage();
        }

        public void loadAllImage() {
            String key;
            try {
                for (Qwirkle.Color color : Qwirkle.Color.values()) {
                    for (Qwirkle.Shape shape : Qwirkle.Shape.values()) {
                        key = new String(color.toString() + " " + shape.toString());
                        qwirkleImages.put(key, GUI.loadImage2(key + ".jpg"));
                        System.out.println(key);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        private void createVrImage() {
            BufferedImage vrImage = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB_PRE);
            Graphics g = vrImage.createGraphics();
            g.setColor(Color.red);
            g.fillRect(0, 0, 50, 48);
            g.dispose();

            this.imageMap.put("TEST IMAGE", vrImage);
        }

        public BufferedImage getBI() {
            return this.biCanvas;
        }

        public void drawVrImage() {
            Graphics g = biCanvas.createGraphics();
            g.drawImage(this.imageMap.get("TEST IMAGE"), 0, index * 50, null);
            g.dispose();
        }

        public void drawRealImage() {
            Graphics g = biCanvas.getGraphics();
            Image image = this.qwirkleImages.get("RED STAR");
            if (image == null) {
                System.out.println("image is null");
            }
            g.drawImage(image, 200, index * 50, null);
            System.out.println("DRAW Real");
            g.dispose();
        }

        public void incIndex() {
            index += 1;
        }
    }

    public static void main(String[] args) {

        System.out.println("load all images");
        JFrame mainFrame = new JFrame("Test Frame");
        mainFrame.setLayout(null);
        mainFrame.setSize(500, 500);
        mainFrame.setVisible(true);
        mainFrame.setBackground(Color.black);
        mainFrame.setLocation(800, 400);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        UserPanel userPanel = new UserPanel();
        mainFrame.add(userPanel);
        userPanel.setSize(500, 500);
        userPanel.setVisible(true);

    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }
}