JComponent wird in JFrame nicht angezeigt

Status
Nicht offen für weitere Antworten.

minos5000

Aktives Mitglied
Hi,

mein Problem ist, daß ich versuche ein Bild in einem Frame anzuzeigen. Dazu habe ich das Bild wie in meinen Tutorials beschrieben in eine JComponent eigebettet und anschließend mittels

Code:
getContentPane.add(*die JComponent*);
validate();

versucht das Bild anzuzeigen. Nur leider tut sich überhaupt nichts und ich hab keine Erklärung warum.

Das Bild selber lade ich mit ImageIO und das funktioniert auch, denn ich habe versuchsweise das Bild in einem neuen JFrame anzeigen lassen und das hat einwandfrei funktioniert.


Ich hoffe, mir kann jemand helfen, ich sitz jetzt schon 2 Tage an dem Problem.



Hier mal die entsprechenden Codezeilen:

Code:
private void openMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                             
        FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif");
        jFileChooser1.setFileFilter(filter);
        int returnVal = jFileChooser1.showOpenDialog(Gui.this);
        if(returnVal == jFileChooser1.APPROVE_OPTION) {
            selectedFile = jFileChooser1.getSelectedFile().getPath();
        }
        File imageFile = new File(selectedFile);
        try {
            image = ImageIO.read(new File(selectedFile));
            ImageComponent imageComponent = new ImageComponent(image);
            
            getContentPane().add(imageComponent); 
            validate();
            pack();

            System.out.println(selectedFile);

        } catch(IOException e) {
            System.out.println(e.toString());
        }
        
        
    }

Code:
public class ImageComponent extends JComponent {
    
    private Image image;
    
    public ImageComponent(Image image) {
        this.image = image;
    }                                                            
    
    public void paintComponent(Graphics g) {
        g.drawImage(image,0,0,null);
    }
    
}
 
Probier's mal mit einem Panel, das verwendet man nämlich normalerweise für solche Sachen:
Code:
public class ImageComponent extends JPanel {
   
    private Image image;
   
    public ImageComponent(Image image) {
        this.image = image;
    }                                                           
   
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image,0,0,null);
    }
   
}
 
Das funktioniert leider auch nicht. Könnte der Grund für das Problem die etwas eigene Handlungsweise von NetBeans sein, welches ich zum bauen der GU verwende? Um Elemente zur GUI hinzuzufügen geht NetBeans nämlich folgendermasen vor:

Ein Beispiel:
Code:
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );


Vielleicht beißt sich das ja, wenn ich später mit einem simplen getContentPane().add(...) selber versuch Komponenten hinzuzufügen??
 
Versuch's mal so:
Code:
public class ImageComponent extends JPanel {
   
    private Image image;
   
    public ImageComponent(Image image) {
        this.image = image;
    }                                                           
   
    public Dimension getPreferredSize()
    {
        return new Dimension(image.getWidth(null), image.getHeight(null));
    }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image,0,0,null);
    }
   
}
Es könnte nämlich am Layout liegen, das das Panel aufgrund der fehlenden preferredSize einfachnicht anzeigt.
 
Jipiee, ich konnte das Problem lösen.

Es hatte tatsächlich mit dem gesetzten Layout zu tun. Wenn man dem ContentPane ein Layout zugewiesen hat, dann scheint es nicht mehr möglich zu sein, über getContentPane().add(...) etwas hinzuzufügen, sondern man muß das über die vom Layout zur Verfügung gestellten Funktionen machen.

Eigentlich logisch, aber trotzdem muß man erst mal drauf kommen.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben