import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.io.*;

public class provaCaricamentoImmagine {
   
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI(); 
            }
        });
    }

    private static void createAndShowGUI() {
        /*
        System.out.println("Created GUI on EDT? "+
        SwingUtilities.isEventDispatchThread());
        */
        
        // 1 una jframe è una finestra
        // 2 l'argomento del cotruttore è il titolo della finestra
        JFrame f = new JFrame("Swing Paint Demo");
        JFrame f1 = new JFrame("altra roba");
        // 3 si stabilisce cosa debba fare il programma quando si clicca sulla finestra
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // creo due oggetti di classe mypanel
        // un pannello è un contenitore
        MyPanel p1 = new MyPanel();
        MyPanel p2 = new MyPanel();
        MyPanel p3 = new MyPanel1();
        MyPanel2 p4 = new MyPanel2(f1);
        // 4 per aggiungere pannelli ad una finestra ho bisogno di prendere il suo pannello (pane) del contenuto (content)
        Container c = f.getContentPane();
        Container c1 = f1.getContentPane();
        // 5 aggiungiamo i pannelli con add
        // i pannelli, che sono rettangoli
        // vengono disposti seguendo 
        // un organizzatore di contenuto (LayoutManager)
        // ogni tipo di contenitore ne ha uno
        // per le frame si chiama BorderLayout
        // divide lo spazio disponibile in cinque parti individuate
        // con le stringhe "Center" e con i punti cardinali
        c.add(p1, "North");
        p2.add(p3);
        c.add(p2, "South");
        c1.add(p4, "Center");
        /*
        c.add(new MyPanel(),"North" );
        c.add(new MyPanel(),"Center");
        c.add(new MyPanel(),"East");
        c.add(new MyPanel(),"West");
        c.add(new MyPanel(),"South");
        */
        
        // 6 il metodo impacchetta la finestra in modo tale che contenga gli elementi aggiunti
        // determina una chiamata ad un metodo che vedremo nel seguito chiamato getPreferredSize
        f.pack();
        f1.pack();        
        // 7 rende visibile la finestra
        f.setVisible(true);
        f1.setVisible(true);
    }
}


class MyPanel extends JPanel {
private int numPaintJobs = 0;
    public MyPanel() {
     // la classe JPanel ha un metodo chiamato setBorder
     // il parametro è il tipo di bordo
        setBorder(BorderFactory.createLineBorder(Color.black));
        // i colori sono oggetti di classe Color, black è un attributo
        int i = (int)(Math.random()*3);
        if (i == 1) setBackground(Color.white);
        if (i == 2) setBackground(Color.red);
        if (i == 0) setBackground(Color.yellow);
    }

    public Dimension getPreferredSize() {
        return new Dimension(250,200);
    }

        // la parte grafica di un pannelo deve essere contenuta
        // nella ridefinizione del metodo paintCom po nent
    public void paintComponent(Graphics g) {
    
        super.paintComponent(g);       

        // disegna un testo in una posizione casuale
        // drawString disegna un testo
        g.drawString("This is my custom Panel!",(int)((Math.random()*250)%150),(int)((Math.random()*250)%150));
        
        int i = (int)(Math.random()*3);
        if (i == 1) setBackground(Color.white);
        if (i == 2) setBackground(Color.red);
        if (i == 0) setBackground(Color.yellow);
    }
    }  
class MyPanel1 extends MyPanel{
Image imm;
public Dimension getPreferredSize() {
        return new Dimension(100,100);
    }
    public void paintComponent(Graphics g){
super.paintComponent(g);
try{
imm = ImageIO.read(new File("prova.jpg"));
}
catch(Exception e){
System.out.println("caricamento immagine");
}
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(imm, 0,0,this);
g2.setColor(Color.WHITE);
g2.drawString("Mario!",
             (int)((Math.random()*100)%50),
             (int)((Math.random()*100)%50));
}

 
}
class MyPanel2 extends JPanel{
public Dimension getPreferredSize() {
        return new Dimension(250,200);
    }
JFrame surj;
public MyPanel2(JFrame j){
    surj = j;
     setBorder(BorderFactory.createLineBorder(Color.black));
    }
    Image imm;
public void paintComponent(Graphics g){
super.paintComponent(g);
try{
imm = ImageIO.read(new File("prova.jpg"));
}
catch(Exception e){
System.out.println("caricamento immagine");
}
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(imm, 0,0,this);
}
}