2 Bilder in JDialog anzeigen

Hallo,

Ich möchte gerne einen JDialog öffnen, in dem man zwischen 2 Bildern wählen kann. Hab auch so weit alles fertig, doch die Bilder werden einfach nicht
angezeigt. Hier die Testklasse:

package urban;

public class testDialog {

public static void main(String[] args) {
	
	
	String decision = "Champagner";
	
	Dialog test = new Dialog(decision);
	
}
	
}

Hier die JDialog Klasse:

package urban;

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JButton;

public class Dialog extends JDialog{
	
	String decision;
	//images
	BufferedImage champagner1;
	BufferedImage champagner2;
	BufferedImage cognac1;
	BufferedImage cognac2;
	BufferedImage vodka1;
	BufferedImage vodka2;
	BufferedImage whiskey1;
	BufferedImage whiskey2;
	BufferedImage tequila1;
	BufferedImage tequila2;
	BufferedImage likör1;
	BufferedImage likör2;
	BufferedImage gin1;
	BufferedImage gin2;
	//-------------------------
	
	//components
	JLabel lblPic1;
	JLabel lblPic2;
	JButton btnPic1;
	JButton btnPic2;
	//----------------
	
	
	
	
	Dialog(String decision){
		setSize(300,200);
		setLocationRelativeTo(null);
		setResizable(false);
		getContentPane().setLayout(null);
		
		lblPic1 = new JLabel();
		lblPic1.setBounds(0, 0, 140, 140);
		getContentPane().add(lblPic1);
		
		lblPic2 = new JLabel();
		lblPic2.setBounds(154, 0, 140, 140);
		getContentPane().add(lblPic2);
		
		btnPic1 = new JButton("Wählen");
		btnPic1.setBounds(0, 148, 146, 23);
		getContentPane().add(btnPic1);
		
		btnPic2 = new JButton("Wählen");
		btnPic2.setBounds(144, 148, 150, 26);
		getContentPane().add(btnPic2);
		setTitle("Wähle einen Star aus!");
		setVisible(true);
		
		
		
		repaint();
		
		
		
		
		if (decision.equals("champagner")){
			
		}
		
	}
}

Habe schon ne Stunde lang rumprobiert finde aber einfach keine Lösung. Wäre nett wenn mir jemand eine Lösung oder einen Ansatz schreiben würde.
LG Lukehart

Du lädst ja auch nirgends die Bilder… -> Grafikdateien laden und anzeigen (Java) – Byte-Welt Wiki
Dialog als Name für deine eigene Klasse ist etwas ungünstig, weil diese in der Standard-Java-Bibliothek bereits verwendet wird. Klar geht das, ist aber nicht besonders gut gewählt.
BTW: Vergiss “NullLayout”! -> LayoutManager der Standard-Java-API – Byte-Welt Wiki

Wie in dem Wiki-Link auch steht: Wichtig könnte die Frage sein, wo die Bilder herkommen. Aus einem Verzeichnis/einer URL, oder sollen die später zusammen mit dem Programm in einer JAR liegen? Wie auch immer, irgendwo sollte da vermutlich was mit ImageIO drin vorkommen …

Okay erstmal danke für die antworten. Die Bilder werden jetzt geladen und an die Klasse übergeben.

package urban;

import java.awt.Image;
import java.awt.Toolkit;

public class testDialog {

public static void main(String[] args) {
	
	
	String decision = "Champagner";
	
	Image champagner1 = Toolkit.getDefaultToolkit().getImage("gfx/snoop.jpg");
	Image champagner2 = Toolkit.getDefaultToolkit().getImage("gfx/roger.jpg");
	
	Choice test = new Choice(decision, champagner1, champagner2);
	
}
	
}

Jetzt habe ich 2 JLabel erstellt in denen ich die Bilder anzeigen möchte. Daran scheitere ich jedoch:

package urban;

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JButton;

public class Choice extends JDialog{
	
	String decision;
	
	//components
	JLabel lblPic1;
	JLabel lblPic2;
	JButton btnPic1;
	JButton btnPic2;
	//----------------
	
	//images
	Image pic1;
	Image pic2;
	//--------------------
	
	
	
	
	Choice(String decision, Image pic1, Image pic2){
		setSize(300,200);
		setLocationRelativeTo(null);
		setResizable(false);
		getContentPane().setLayout(null);
		
		
		this.pic1 = pic1;
		this.pic2 = pic2;
		
		
		lblPic1 = new JLabel();
		lblPic1.setBounds(0, 0, 140, 140);
		getContentPane().add(lblPic1);
		
		lblPic2 = new JLabel();
		lblPic2.setBounds(154, 0, 140, 140);
		getContentPane().add(lblPic2);
		
		btnPic1 = new JButton("Wählen");
		btnPic1.setBounds(0, 148, 146, 23);
		getContentPane().add(btnPic1);
		
		btnPic2 = new JButton("Wählen");
		btnPic2.setBounds(144, 148, 150, 26);
		getContentPane().add(btnPic2);
		setTitle("Wähle einen Star aus!");
		setVisible(true);
		
		
		
		repaint();
		
		
		
		
		if (decision.equals("champagner")){
		
		}
		
	}
}

PS: Klassenname ist geändert. Da hast du recht Dialog ist kein guter Name. Und warum kein NullLayout?

LG Luca

Habe noch mal ein bisschen in die API geschaut und herausgefunden wie ich ein Bild in ein JLabel lade. Dafür brauche ich ein ImageIcon. Hier die Testklasse die 2 ImageIcons an die Hauptklasse übergibt:

package urban;

import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.ImageIcon;

public class testDialog {

public static void main(String[] args) {
	
	
	String decision = "Champagner";
	
	ImageIcon champagner1 = new ImageIcon(Toolkit.getDefaultToolkit().getImage("gfx/snoop.jpg"));
	ImageIcon champagner2 = new ImageIcon(Toolkit.getDefaultToolkit().getImage("gfx/roger.jpg"));
	
	

	
	Choice test = new Choice(decision, champagner1, champagner2);
	
}
	
}

Diese beiden ImageIcons sollen in der folgenden Klasse choice in 2 JLabels angezeigt. Habe eigentlich alles korrekt implementiert, aber die Bilder werden nicht angezeigt. :frowning: Hier die Klasse:

package urban;

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JButton;

public class Choice extends JDialog{
	
	String decision;
	
	//components
	JLabel lblPic1;
	JLabel lblPic2;
	JButton btnPic1;
	JButton btnPic2;
	//----------------
	
	//images
	ImageIcon pic1;
	ImageIcon pic2;
	//--------------------
	
	
	
	
	Choice(String decision, ImageIcon pic1, ImageIcon pic2){
		setSize(300,200);
		setLocationRelativeTo(null);
		setResizable(false);
		getContentPane().setLayout(null);
		
		
		this.pic1 = pic1;
		this.pic2 = pic2;
		
		
		lblPic1 = new JLabel();
		lblPic1.setBounds(0, 0, 140, 140);
		lblPic1.setIcon(pic1);
		getContentPane().add(lblPic1);
		
		lblPic2 = new JLabel();
		lblPic2.setBounds(154, 0, 140, 140);
		lblPic2.setIcon(pic2);
		getContentPane().add(lblPic2);
		
		btnPic1 = new JButton("Wählen");
		btnPic1.setBounds(0, 148, 146, 23);
		getContentPane().add(btnPic1);
		
		btnPic2 = new JButton("Wählen");
		btnPic2.setBounds(144, 148, 150, 26);
		getContentPane().add(btnPic2);
		setTitle("Wähle einen Star aus!");
		setVisible(true);
		
		
		
		repaint();
		
		
		
		
		if (decision.equals("champagner")){
		
		}
		
	}
}

Bin dankbar für jede Hilfe.

LG Luca

der Code geht bei mir mit zu ladenden Bildern (bzw. nur eins bei beiden eingesetzt getestet),
was liefert

		System.out.println(f.exists());
		System.out.println(f.getAbsolutePath());
		System.out.println(champagner1.getImage().getHeight(null));```
?

Hier mal ein Beispiel zu Ausprobieren:

import java.awt.*;
import java.net.*;
import java.io.*;
import java.awt.event.*;
import javax.swing.*;
import javax.imageio.*;

public class ImageChoice implements MouseListener {
   private Icon[] icons;
   
   public ImageChoice(Window parent, Icon... icons) {
      this.icons = icons;
      JDialog dialog = new JDialog(parent, "Bildauswahl");
      dialog.setModal(true);
      dialog.add(createImagePanel());
      dialog.pack();
      dialog.setLocationRelativeTo(parent);
      dialog.setVisible(true);
   }
   
   private JPanel createImagePanel() {
      JPanel panel = new JPanel(new GridLayout(1, 0, 10, 10));
      panel.setBorder(BorderFactory.createEmptyBorder(30, 30, 30, 30));
      for(int i = 0; i < icons.length; i++) {
         JLabel label = new JLabel(icons**);
         label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
         label.addMouseListener(this);
         panel.add(label);
      }      
      
      return panel;
   }
   
   public void mouseEntered(MouseEvent e) {}
   public void mouseExited(MouseEvent e) {}
   public void mouseClicked(MouseEvent e) {}
   public void mouseReleased(MouseEvent e) {}
   
   public void mousePressed(MouseEvent e) {
      Object source = e.getSource();
      if(source instanceof JLabel) {
         JLabel label = (JLabel)source;
         if(label.getIcon().equals(icons[0])) {
            JOptionPane.showMessageDialog(null, "Stan Laurel");
         }
         else {
            JOptionPane.showMessageDialog(null, "Oliver Hardy");
         }
      }
   }
   
   public static void main(String[] args) {      
      Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
      JFrame frame = new JFrame("Hauptfenster");  
      JButton button = new JButton("Bild auswählen"); 
      
      try {
         Icon laurel = new ImageIcon(ImageIO.read(new URL("http://hoerzu.images.dvbdata.com/1052522/1052522_320x240.jpg")));
         Icon hardy = new ImageIcon(ImageIO.read(new URL("http://hoerzu.images.dvbdata.com/1052457/1052457_320x240.jpg")));
         
         button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
			   new ImageChoice(frame, laurel, hardy);
            }
         });         
      }
      catch(MalformedURLException murle) {
         System.out.println(murle);
      }
      catch(IOException ioe) {
         System.out.println(ioe);
      }
      
      JPanel panel = new JPanel(new GridBagLayout());
      panel.add(button);

      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.setSize(dim.width * 60 / 100, dim.height * 60 / 100);
      frame.add(panel);
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }
}

ohne “NullLayout”, sondern mit LayoutManagern
mit Bild einlesen
mit Eventverarbeitung
mit Komposition (nicht von JDialog erben)

@SlaterB
Dein Code liefert folgendes zurück:
false
C:\Users\Luca\workspace\Urban\gfx\snoop.jpg
-1

Heißt meines Erachtens nach ja das das Bild nicht existiert, also nicht gefunden wird. Das 2. ist der absolute Pfad. Ich hab nochmal nachgeschaut. Der absolute Pfad zu dem Bild ist auch falsch. Er sollte lauten: C:\Users\Luca\workspace\Urban\src\gfx\snoop.jpg

LG Luca

*** Edit ***

@L-electron-X
Danke erstmal, die Klasse sieht ganz cool aus. Habe sie auch so weit bei mir reinkopiert. Funktioniert auch:D Habe jedoch noch das Problem mit dem Bilder einlesen, sprich es werden statt meinen Bilder nur 2 schwarze Striche angezeigt :-(.
Eine Frage zu dem Code hab ich gleich beim ersten raufschauen. Was ist das:

public ImageChoice(Window parent, Icon... icons)

Habe so was noch nie gesehen :slight_smile:

LG Luca

Du meinst Icon... icons ?
Das ist ein so genannter vararg, also variable Argumente. Die wurden mit Java 5 eingeführt.
Varargs müssen in einer Methodenparameterliste immer an letzter Stelle stehen.
Du kannst entweder mehrere Referenzen auf Icon-Typen oder ein Icon-Typ-Array übergeben. Sehr flexibel also.
Bemühe mal Google für mehr Infos dazu.

Window ist die gemeinsame Basisklasse von JFrame und JDialog. Du kannst dem Konstruktor also eine Referenz auf einen JFrame oder auf einen JDialog übergeben, beides wird funktionieren.

nur falls nicht direkt kombiniert, wäre Angabe „src/gfx/snoop.jpg“ im Programm dann sicherlich ein Fortschritt,
oder das gfx-Verzeichnis ins Grundverzeichnis des Projekts kopieren,

aber ich kann verstehen wenn noch eine Alternative zu diesen beiden Varianten gesucht ist,
im Moment habe ich nix parat, vielleicht morgen,
falls bis dahin nicht geklärt, noch Hoffnung auf mich und keine Antwort zu sehen evtl. Nachfrageposting :wink:

Die Antwort auf deine Frage sind wir dir noch schuldig.
Die Positionierung anhand von Koordinaten funktioniert nur auf deinem Rechner, mit deinem Betriebssystem, mit deiner Java-Version ordentlich.
Auf anderen Rechnern, Betriebssystemen und Java-Versionen kann die Anzeige der Komponenten völlig anders aussehen. Zum Beispiel kommt es zu unterschiedlichen Ausgaben der Dimensionen von Komponenten, Schriftarten und Abständen. Was auf deinem System funktioniert, kann auf einem anderen System vielleicht schon nicht mehr lesbar sein, weil z.B. der Text in einem JLabel nicht mehr ganz hinein passt, etc. Eine Berechnung ist aufwändig, man muss viel testen.
Auch wenn neue Komponenten hinzukommen sollen, oder sich die Anordnung mal ändern soll, bist du mit Koordinaten völlig aufgeschmissen. Du musst alles neu ausrichten, anpassen, ausprobieren. Es ist viel aufwändiger eine GUI ohne LayoutManager zu pflegen.
Ein LayoutManager dagegen kümmert sich immer für dich um die Berechnung der Platzverhältisse in deiner GUI. In Folge daraus wird deine GUI auf anderen Systemen immer richtig dargestellt werden. Die Wartung einer solchen GUI ist viel einfacher und auch noch nach einem Jahr besser zu verstehen.
Es ist zwar mit etwas Aufwand verbunden, die Programmierung mit LayoutManagern zu erlernen, aber der wird sich in jedem Fall für dich lohnen.

Im Wiki findest du bereits einige in deutsch verfasste Artikel zu LayoutManagern, die dir den Einstieg erleichtern. Wenn du dann mal Fragen zu LayoutManagern hast, findest du hier in jedem Fall kompetente Ansprechpartner.

Zu deinem Pfad-Problem: Schreibe mal den absoluten Pfad eines Bildes und den absoluten Pfad der Klasse, die das Bild einliest.
Und: Marco13 hat es schon angedeutet. Der einzusetzende Code richtet sich auch danach, wo die Bilder in der fertigen Programmversion herkommen. Wo werden die gespeichert werden?

Naja Aufwand ist relativ. Ich fände es viel aufwändiger, mir “gute” Koordinaten auszudenken / zu testen, als Layout-Manager zu verwenden.

Noch ein Gedanke: Was machst du, wenn dein Dialog plötzlich verkleinert oder vergrößert werden soll? Der Layout-Manager macht die Arbeit dann für dich, du kannst Dingen sogar Mindestgrößen geben und vieles mehr.

@L-ectron-X
Ja das meinte ich, danke für die Erklärung :slight_smile:
@SlaterB
Tausend Dank!!! Mit deinem Pfad funktioniert es :smiley:
@L-ectron-X
Danke für die ausführliche Erläuterung. Jetzt verstehe ich den Sinn von Layout Managern. Habe mich auch gleich mal ein bisschen eingelesen.

Habe auch gleich eine Frage :smiley: Also ich hab jetzt mein Hauptframe mit Layout Managern versehen, benutze eine Mischung aus Borderlayout und Boxlayout.Ergebnis:

Sieht ja alles schon ganz gut aus, aber ich möchte das die JLabels links sind und rechts daneben die ComboBoxen. Also Links Geschlecht: und rechts daneben die ComboBox zum wählen :slight_smile: Wie krieg ich das hin?

LG Luca

Lesson: Laying Out Components Within a Container (The Java™ Tutorials > Creating a GUI With JFC/Swing)
vom Standard GridBagLayout wahrscheinlich, wenn auch mühsam,
weil GridLayout mit gleichgroßen Boxen selten ausreicht,

besser noch außerhalb von Swing nach besseren Ergänzungen wie TableLayout suchen,
wobei das nur ein Name ist den ich über 10 Jahre behalten habe, wird sicher noch andere geben

oh, ist ja sogar auch auf der Oracle-Seite
TableLayout - An Alternative to GridBagLayout

Tatsächlich ist gerade DAS eines der wenigen häufig benötigten Layouts, die nicht so leicht mit den “einfachen” LayoutManagern abzubilden sind. Das ALLERmeiste kann man mit GridLayout und BorderLayout machen, vielleicht noch mal ein BoxLayout hier und da. Aber keines dieser Layouts erlaubt dieses…


xxx        |  yyyyyyyyyyyy
xxxxxxxxxx |  yyyyyyyy
xx         |  yyyyyyyyyyyy

untereinander in Spalten ausgerichtete.

Wenn die Labels und die ComboBoxen gleich groß sein könnten, könnte man einfach

panel.setLayout(new GridLayout(0,2));
panel.add(label0);
panel.add(comboBox0);
...
panel.add(labelX);
panel.add(comboBoxX);

machen. Das sieht aber eher sch…lecht aus, wenn die Elemente unterschiedlich breit sind.

Lösen kann man das natürlich, mit einem GridBagLayout. Und tatsächlich hatte ich mir für genau diesen Zweck mal so eine utlity-Funktion gebastelt:

    /**
     * Add the given components as a new row in the given container, 
     * which must have a <code>GridBagLayout</code>.
     * 
     * @param container The container
     * @param row The row
     * @param extraSpaceColumn The index of the column that should receive
     * any extra space
     * @param components The components to add
     * @throws IllegalArgumentException If the given container does 
     * not have a <code>GridBagLayout</code>.
     */
    public static void addRow(
        Container container, int row, int extraSpaceColumn, 
        Component ... components)
    {
        if (!(container.getLayout() instanceof GridBagLayout))
        {
            throw new IllegalArgumentException(
                "Container does not have a " +
                "GridBagLayout: "+container.getLayout());
        }
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.fill = GridBagConstraints.BOTH;
        constraints.insets = new Insets(0, 0, 0, 0);
        constraints.weighty = 1.0;
        constraints.weightx = 1.0;
        constraints.gridy = row;
        for (int i=0; i<components.length; i++)
        {
            Component component = components**;
            constraints.gridx = i;
            if (i != extraSpaceColumn)
            {
                constraints.weightx = 0.0;
            }
            else
            {
                constraints.weightx = 1.0;
            }
            container.add(component, constraints);
        }
    }

(aus https://github.com/javagl/CommonUI/blob/master/src/main/java/de/javagl/common/ui/GridBagLayouts.java )

Damit wäre das dann auch recht einfach:

panel.setLayout(new GridBagLayout());
int row = 0;
addRow(panel, row++, 1, label0, comboBox0);
addRow(panel, row++, 1, label1, comboBox1);
...
addRow(panel, row++, 1, labelX, comboBoxX);

Es ist noch eine Alternative möglich.

Man kann jede Zeile des Layouts (in einer Methode) in ein BorderLayout hüllen und dabei dem Label links eine gewünschte Größe mitgeben und dieses in BorderLayout.WEST unterbringen, während der Rest in BorderLayout.CENTER residiert.

Die ganzen Zeilen wiederum kann man in einem GridLayout (oder einem VerticalLayout - das ist nur keines, das offiziell bei Swing dabei ist) packen.

Falls gewünscht, suche ich mal Quellcode raus, wo ich das so gemacht habe und bastele ein Beispiel daraus.

Würde ach gehen:

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

    public class AlcTest {
       private String[] gender;
       private String[] genre;
       private String[] vip;
       private String[] alcohol;
       private String[] softdrink;

       public AlcTest() {
          createModels();
          JFrame frame = new JFrame("Alkohol-Finder");
          frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
          frame.add(createMainPanel(), BorderLayout.CENTER);
          frame.add(createButtonPanel(), BorderLayout.SOUTH);
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }

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

       private JPanel createMainPanel() {
          JPanel mainPanel = new JPanel(new BorderLayout());
          mainPanel.setBorder(BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder("Auswahl"),
                BorderFactory.createEmptyBorder(20, 20, 20, 20)));
          JPanel contentPanel = new JPanel(new GridLayout(1, 0));
          contentPanel.add(createLabelPanel());
          contentPanel.add(createComboBoxPanel());
          mainPanel.add(contentPanel, BorderLayout.CENTER);
          return mainPanel;
       }

       private void createModels() {
          gender = new String[] {"", "Männlich", "Weiblich"};
          genre = new String[] {"", "Rap", "Funk", "Soul", "Chillout"};
          vip = new String[] {"", "Sportler", "Schauspieler", "DJ"};
          alcohol = new String[] {"", "Wacholder", "Agaven", "Getreide"};
          softdrink = new String[] {"", "Cola", "Tonic", "Energy"};
       }

       private JPanel createLabelPanel() {
          JPanel panel = new JPanel(new GridLayout(0, 1, 0, 5));
          panel.add(new JLabel("Geschlecht"));
          panel.add(new JLabel("Musik Genre"));
          panel.add(new JLabel("VIP"));
          panel.add(new JLabel("Alkohol"));
          panel.add(new JLabel("Soft Drink"));
          return panel;
       }

       private JPanel createComboBoxPanel() {
          JPanel panel = new JPanel(new GridLayout(0, 1, 0, 5));
          panel.add(new JComboBox<String>(gender));
          panel.add(new JComboBox<String>(genre));
          panel.add(new JComboBox<String>(vip));
          panel.add(new JComboBox<String>(alcohol));
          panel.add(new JComboBox<String>(softdrink));
          return panel;
       }

       private JPanel createButtonPanel() {
          JPanel panel = new JPanel();
          panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 20, 0));
          panel.add(new JButton("Weiter"));
          panel.add(new JButton("Abbrechen"));
          return panel;
       }
    }```

[QUOTE=Crian]
Man kann jede Zeile des Layouts (in einer Methode) in ein BorderLayout hüllen und dabei dem Label links eine gewünschte Größe mitgeben und dieses in BorderLayout.WEST unterbringen, während der Rest in BorderLayout.CENTER residiert.[/QUOTE]

Das setPreferredSize(...) ist für mich hier der „kleine Bruder“ vom setBounds(...) beim null-Layout. Welche „Gewünschte Größe“ gibt man denn da? (Und wenn sich das jemand mit Kurzsichtigen-Font-Größen-Einstellung in Arabischer Schrift auf einem Smartphone ansehen will? :smiley: ). Man könnte zwar was tricksen (z.B. die maximale Preferred Size aller Labels verwenden), aber es ist eben etwas frickelig…

Stimmt, es ist keine ideale Lösung. Ich verwende es für einen ähnlichen Zweck für kurze Label in einer großen Eingabemaske. Da habe ich einfach eine Konstante definiert. Sicher könnte man es auch abhängig von der Schriftgröße, Look & Feel etc. machen, aber ich habe da für diesen Zweck den einfachen Weg gewählt.

Dinge in Schleifen in einer anderen Methode in JPanels einpacken zu lassen, macht dies und das ziemlich einfach und elegant.

Ich bin etwas auf StackOverflow gesurft und alle Bilder innerhalb von Ressource zu laden, ist gar nicht so leicht, sondern nur über Reflections möglich, somit hab ich meine 2 cents, wenn die Bilder a, b usw. heißen:

import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.imageio.*;
import javax.swing.*;

public class AlleImages {
    // Attribute

    public static void main(String[] args) {
        // neue Instanz
    }

    public AlleImages() {
        // Rufe init auf
    }

    private void init() {
        icon = new ImageIcon();
        label = new JLabel(icon);
        box = new JComboBox<URL>();
        box.setEditable(false);
        box.addActionListener(box);
        frame = new JFrame("Alle Images");
        frame.setLayout(new BorderLayout());
        frame.add(box, BorderLayout.NORTH);
        frame.add(new JScrollPane(label), BorderLayout.CENTER); // Benutz LayoutManager

        try {
            String chara = "a";
            while (true) {
                ImageIO.read(new File(chara + ".png").toURI().toURL());
                box.addItem(new File(chara + ".png").toURI().toURL());
                chara = (char) (chara.toCharArray()[0] + 1) + "";
            }
        } catch (Exception e) {
        }
        box.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                icon = new ImageIcon((URL) box.getSelectedItem());
                label.setIcon(icon);
            }
        });

        // Kalibriere frame
    }
}```