0

I'm trying to display couple of images on the other image. It's important for me to have this pictures in two diffrent classes becous i need to connect this images with the other properties. I wrote a class which add and display one picture at a time.

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);
            }
        };

}

Let say i have two classes of that kind, each with diffrent image. Then I wrote my main class with main method which define frame and create image.

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;
    }

}

But when i add next frame.add(someobject.pane); it's delete previous one and displays only the last one. How to make them display together but from two separate classes.

Vekka
  • 141
  • 1
  • 1
  • 12
  • Blad odczytu obrazka = Error reading image (polish) – Leo Oct 07 '14 at 20:15
  • The exact approach depends on the content and goal. Are you relying on transparency or geometry to compose the two images? Please clarify. – trashgod Oct 07 '14 at 21:12
  • I have some image in background and i want to generate some pictures on this image, but this pictures, are going to generete at random moment and some of them are going to be generated by button. – Vekka Oct 07 '14 at 22:05
  • @Vekka are u using any ide.? and ya when u trying to make image on image u need to set order for the same. – Kishan Bheemajiyani Oct 08 '14 at 04:53

2 Answers2

3

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

You may be going about this incorrectly, trying to make each of these classes a JPanel. I mean, technically you could make it happen with a JLayeredPane. But I would go about it differently.

First to handle your "other properties", you could use an interface to combine the objects you want to draw. Just have a define draw method in the interface.

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

Then you can have a main panel to do the drawing. This panel will hold a List or Map of Drawable objects; a List if access after adding them is not important, and a Map if you need easy access to them after you add. For instance.

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

Now you can just make any class you want implements Drawable, and just add an instance of that class to the drawList or drawMap. This way everything is all drawn onto the same surface. For example

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());
    }
}
Paul Samsotha
  • 205,037
  • 37
  • 486
  • 720
-1

In JavaFx You could use StackPane and ImageView Put all images in ImageView and leter use stack Pane to put new image over the old one.

Mateusz B
  • 19
  • 3