java - 两张图片,一张在 Java 中

标签 java image swing class

我正在尝试在另一张图像上显示几张图像。 对我来说,将这些图片放在两个不同的类中很重要,因为我需要将这些图像与其他属性连接起来。 我编写了一个类,一次添加并显示一张图片。

import java.awt.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Obrazek {
     BufferedImage image;
     Obrazek(){
    File imageFile = new File("tło.jpg");
        try {
            image = ImageIO.read(imageFile);
        } catch (IOException e) {
            System.err.println("Blad odczytu obrazka");
            e.printStackTrace();
        }
     }
    JPanel pane = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(image, 0, 0, null);
            }
        };

}

假设我有两个这样的类,每个类都有不同的图像。 然后我用 main 方法编写了我的主类,它定义框架并创建图像。

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


public class ButtonDemo{


        public static void main(String[] args)  {
            JFrame frame = buildFrame();
           Obrazek obraz = new Obrazek();


            frame.add(obraz.pane);
        }
        private static JFrame buildFrame() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setVisible(true);
        return frame;
    }

}

但是当我添加下一帧时。add(someobject.pane);它删除前一张并仅显示最后一张。如何让它们一起显示,但来自两个不同的类。

最佳答案

"It's important for me to have this pictures in two diffrent classes becous i need to connect this images with the other properties"

您可能会错误地处理这个问题,试图将这些类中的每一个都设为 JPanel。我的意思是,从技术上讲,您可以使用 JLayeredPane 来实现这一点。但我会采取不同的方式。

首先要处理您的“其他属性”,您可以使用界面来组合您想要绘制的对象。只需在界面中定义一个draw方法即可。

public interface Drawable {
    void draw(Graphics g);
}

然后你就可以有一个主面板来进行绘图了。该面板将保存 Drawable 对象的 ListMap;如果添加后的访问并不重要,则使用 List;如果添加后需要轻松访问它们,则使用 Map。例如。

public class DrawingPanel extends JPanel {
    List<Drawable> drawList;
    // Map<String, Drawable> drawMap;

    public void addToDrawList(Drawable drawable) { 
        drawList.add(drawable);
        repaint();
    }

    // public void addToDrawMap(String key, Drawable drawable) {
    //     drawMap.put(key, drawable);
    //     repaint();
    // }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for(Drawable drawable : drawList){
            drawable.draw(g);
        }

        // for (Drawable drawable : drawMap.values()) {
        //     drawable.draw(g);
        // }
    }
}

现在,您可以将任何您想要的类实现 Drawable,然后将该类的实例添加到 drawListdrawMap 中。这样所有的东西都被绘制到同一个表面上。例如

class HelloDrawable implements Drawable {
    @Override
    public void draw(Graphics g) {
        g.drawString("Hello", 100, 100);
    }
}
class WorldDrawable implements Drawable {
    @Override
    public void draw(Graphics g) {
        g.drawString("World", 150, 100);
    }
}

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        DrawingPanel panel = new DrawingPanel();
        panel.addToDrawList(new HelloDrawable());
        panel.addToDrawList(new WorldDrawable());

        // panel.addToDrawMap("Hello", new HelloDrawable());
    }
}

关于java - 两张图片,一张在 Java 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26244430/

相关文章:

reactjs - 如何直接设置<Image/>组件的边距?

c# - 如何使用元数据创建 png 文件

java - 在 java 中使用 HTML 和现有变量

java - 可以在 Listener 类中使用 Adapter 吗?

java - 在 Linux 中运行时如何在 Java 中创建符号链接(symbolic link)?

java - 如何在 Label JavaFX 中添加多行

image - Matlab-改进图像裁剪黑边的代码

java - 如何刷新第二个表格

java - 如何从已知点产生声音?

java - 更改 jtable 中的默认行颜色