这两个图像,一个在另一个Java中

时间:2014-10-07 20:12:54

标签: 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;
    }

}

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

2 个答案:

答案 0 :(得分:3)

  

“对于我来说,将这些图片分成两个不同的类别非常重要,因为我需要将这些图像与其他属性相关联”

您可能会错误地进行此操作,尝试将每个类设为JPanel。我的意思是,从技术上讲,你可以用JLayeredPane来实现它。但我会采取不同的方式。

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

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

然后您可以使用主面板进行绘图。此面板将包含ListMapDrawable个对象; 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); // } } } 。例如。

implements Drawable

现在,您可以创建所需的任何课程drawList,然后只需将该课程的实例添加到drawMapclass 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()); } } 。这样一切都被绘制在同一个表面上。例如

{{1}}

答案 1 :(得分:-1)

在JavaFx中您可以使用StackPane和ImageView 将所有图像放在ImageView中并使用堆栈窗格将新图像放在旧图像上。