Swing JLabel mit Bild auf JPanel

xadoX

Aktives Mitglied
Hey Leute,

hab auf nem JPanel nen Button, durch den sich ein FileChooser öffnet und man ein Bild auswählen kann. Das ausgewählte Bild soll auf einem JLabel gezeichnet werden und dieses dann auf das JPanel gelegt werden. Der Button auf dem JPanel soll weiterhin sichtbar sein. Mein Code sieht wie folgt aus:

Java:
if (returnVal == JFileChooser.APPROVE_OPTION){
	    	File bild = fc.getSelectedFile();
                ImageIcon icon = new ImageIcon(bild.getPath());
                JLabel label = new JLabel(icon);
                label.setOpaque(false);
                gui.jPanelBild.add(label);
                gui.jPanelBild.repaint();
}

Leider passiert aber gar nichts. Was mach ich falsch?
 
ruf statt repaint mal revalidate auf. Außerdem musst du natürlich drauf achten welchen Layoutmanager jPanelBild benutzt, vllt. musst du ja noch irgendwelche Contraints oder x/y oder was auch immer setzen.
 
Schreib doch mal anstatt von
Code:
new ImageIcon(bild.getPath());
Code:
new ImageIcon(bild.getAbsolutePath());
und nach dem
Code:
gui.jPanelBild.repaint();
noch ein
Code:
gui.jPanelBild.validate();
.
 
Hab alles umgesetzt, leider immer noch keine Reaktion.

Hier der aktuelle Code:

Java:
if (returnVal == JFileChooser.APPROVE_OPTION){
	    	File bild = fc.getSelectedFile();
                ImageIcon icon = new ImageIcon(bild.getAbsolutePath());
                JLabel label = new JLabel(icon);
                label.setOpaque(false);
                label.setSize(Gui.getInstance().jPanelBild.WIDTH, Gui.getInstance().jPanelBild.HEIGHT);
                Gui.getInstance().jPanelBild.add(label);
                label.setVisible(true);
                Gui.getInstance().jPanelBild.repaint();
                Gui.getInstance().jPanelBild.validate();
                Gui.getInstance().jPanelBild.revalidate();
             }
 
Nochmals die Frage: Welches Layout hat denn
Code:
Gui.getInstance().jPanelBild
überhaupt? Denn falls es kein NullLayout besitzt (was ich nicht hoffe), dann solltest du die PreferredSize des JLables ändern und nicht
Code:
setSize()
aufrufen.
 
anscheinend benutzt du das null-Layout... vielleicht hast du ja bei der Location 0|0 nen anderen Component der das Bild verdeckt, vielleicht kann auch das Bild nicht geladen werden und deswegen ist das JLabel sozusagen unsichtbar...

solange du nicht den ganzen Code postest können wir leider nur rumraten 😉
 
Also so sieht die Gui aus:

panels.jpg


Der folgende Code wurde durch einen Guibuilder erzeugt:

Java:
javax.swing.GroupLayout jPanelBildLayout = new javax.swing.GroupLayout(jPanelBild);
        jPanelBild.setLayout(jPanelBildLayout);
        jPanelBildLayout.setHorizontalGroup(
            jPanelBildLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelBildLayout.createSequentialGroup()
                .addContainerGap(85, Short.MAX_VALUE)
                .addGroup(jPanelBildLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jButtonRemoveBild, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButtonOpenBild, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)))
        );
        jPanelBildLayout.setVerticalGroup(
            jPanelBildLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelBildLayout.createSequentialGroup()
                .addComponent(jButtonRemoveBild, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 58, Short.MAX_VALUE)
                .addComponent(jButtonOpenBild))
        );
 
Erstmal sollte ich erwähnen, dass man seine Code schon verstehen sollte, v.a. wenn er schon durch einen GUI-Builder erzeugt wurde.

Zum Problem:
Wenn du schon das GroupLayout verwendest, würde ich an deiner Stelle das JLabel bereits beim Erstellen der GUI es dieser hinzufügen (Opaque = false, evtl. Border = null). Danach brauchst du dem JLabel nur noch das Bild zuweisen mit
Code:
label.setIcon(new ImageIcon(bild.getAbsolutePath()));
 
Wenn du schon das GroupLayout verwendest, würde ich an deiner Stelle das JLabel bereits beim Erstellen der GUI es dieser hinzufügen (Opaque = false, evtl. Border = null). Danach brauchst du dem JLabel nur noch das Bild zuweisen mit label.setIcon(new ImageIcon(bild.getAbsolutePath()));

Danke, das ist eine gute Idee. Werde es umsetzen und schauen obs dann klappt.
 

Neue Themen


Zurück
Oben