2

私はJava2Dゲームライブラリに取り組んでいます。が呼び出されるたびpaintImage()に実行するという名前のメソッドが必要です。graphics.drawImage()paintImage()

public void paintImage(image1, x, y){        
    //i want it to run graphics.drawImage every time it is called.        
}

public void anotherMethod(){        
    paintImage(...);
    paintImage(...);
    //paint as many times as i want.        
}

public void paintComponent(Graphics graphics){
    graphics.drawImage();
    super.paintComponents();
} 

お時間をいただきありがとうございます。提案を残してください。申し訳ありませんが、これを説明するのは難しいです。

4

2 に答える 2

3

単一画像表示用

public class DrawingDemo {    
    private JPanel panel;
    private MyImage imageData;

    public DrawingDemo() {
        ...            
        panel = new JPanel() {
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (imageData != null) {
                    g.drawImage(imageData.getImage(), imageData.getX(), imageData.getY(), this);
                }

            }
        };
        ...
    }

    public void paintImage(Image image1, int x, int y) {
        imageData = new MyImage(image1, x, y);
        panel.repaint();
    }

    public void anotherMethod() {
        paintImage(...);
        paintImage(...);
    }
}

public class MyImage {    // bean class for storing image information
    private Image image;
    private int x;
    private int y;

    public MyImage(Image image, int x, int y) {
        this.image = image;
        this.x = x;
        this.y = y;
    }

    public Image getImage(){
        return image;
    }

    public int getX(){
        return x;
    }

    public int getY(){
        return y;
    }
    ... you can add setter methods
}

更新:複数の画像を表示する場合

    private JPanel panel;
    private ArrayList<MyImage> imageData; // or any other data structure you like

    public DrawingDemo() {
        imageData = new ArrayList<>();
        JFrame frame = new JFrame();
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel = new JPanel() {

            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                for (MyImage myImage : imageData) {
                    g.drawImage(myImage.getImage(), myImage.getX(), myImage.getY(), this);
                }
            }
        };
        frame.add(panel);
        frame.setVisible(true);

    }

    public void paintImage(Image image1, int x, int y) {
        imageData.add(new MyImage(image1, x, y));
        panel.repaint();
    }

    public void anotherMethod() {
        paintImage(new ImageIcon("/home/blackadmin/Desktop/image.jpg").getImage(), 0, 0);
        paintImage(new ImageIcon("/home/blackadmin/Desktop/image2.jpg").getImage(), 50, 50);
        paintImage(new ImageIcon("/home/blackadmin/Desktop/image3.jpg").getImage(), 100, 100);
    }

出力: ここに画像の説明を入力してください この回答
を ご覧くださいコメント何もわからない場合は、これがお役に立てば幸いです

于 2012-08-14T15:16:40.700 に答える
1

あなたがやろうとしているのは、クラスのいくつかの状態に変更を加えてから、それらの状態の変化に基づいて変更を加えて画像を再描画することです。つまり、アニメーションを作成しようとしているのかもしれません。その場合、画像の描画はすべて、Graphicsオブジェクトを使用するpaintComponentメソッド内か、paintCocalzmponentに渡されたGraphicsオブジェクトを使用するpaintComponentによって呼び出される別のメソッドのいずれかで行う必要があります。これは、Graphicsパラメーターを他のメソッドに渡すことで実行できます。次に、を呼び出して、 JVManotherMethodがGUIを再描画するように要求しrepaint()ます。例えば:

public void anotherMethod() {
    x++;
    y++;
    repaint(); // this will stimulate JVM to call paint/paintComponent
}

private void paintImage(Graphics g, BufferedImage img, int x, int y2) {
    g.drawImage(img, x, y2, this);
}

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    paintImage(g, image1, x, y);
}

この完全な例は次のとおりです。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.beans.Transient;

import javax.swing.*;

public class PaintEg extends JPanel {

    private static final int IMG_W = 30;
    private static final int IMG_H = IMG_W;
    private static final int PREF_W = 400;
    private static final int PREF_H = PREF_W;
    private static final int TIMER_DELAY = 20;
    private BufferedImage image1;
    private int x;
    private int y;

    public PaintEg() {
        image1 = createImg();
        new Timer(TIMER_DELAY, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                anotherMethod();
            }
        }).start();
    }

    private BufferedImage createImg() {
        BufferedImage img = new BufferedImage(IMG_W, IMG_H, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = img.createGraphics();
        g2.setBackground(Color.red);
        g2.clearRect(0, 0, IMG_W, IMG_H);
        g2.setColor(Color.blue);
        g2.fillRect(IMG_W / 4, IMG_H / 4, IMG_W / 2, IMG_H / 2);
        g2.dispose();
        return img;
    }

    public Dimension getPreferredSize() {
        return new Dimension(PREF_W, PREF_H);
    }

    public void anotherMethod() {
        x++;
        y++;
        repaint(); // this will stimulate JVM to call paint/paintComponent
    }

    private void paintImage(Graphics g, BufferedImage img, int x, int y2) {
        g.drawImage(img, x, y2, this);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        paintImage(g, image1, x, y);
    }


    private static void createAndShowGUI() {
        PaintEg paintEg = new PaintEg();

        JFrame frame = new JFrame("PaintEg");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(paintEg);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
于 2012-08-14T17:50:30.780 に答える