# Probleme beim Hinzufügen von Objekten zu getContentPane()



## minos5000 (16. Aug 2007)

Ich versuche jetzt schon eine ganze Weile zu einem JFrame ein JPanel mit einem Bild hinzuzufügen, was auch einmal kurzfristig funktioniert hat, aber nicht so wie ich es mir vorstelle, weshalb ich es wieder geändert habe. Aber nun wird das Bild nicht mehr angezeigt und ich kann die Ursache dafür einfach nicht finden.

Im folgenden erst einmal der Code. Ich verwende zum entwickeln NetBeans der den Code für die Gui selbst erzeugt, deshalb nicht über den etwas seltsamen Stil wundern.


```
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.awt.Container;
import javax.imageio.*;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Gui_1 extends javax.swing.JFrame {
    
    private String selectedFile;
    private Image background;
    private Graphics g;
    private BufferedImage image;
    private ImageComponent_1 imageComponent;
    private Component[] component;
    
    
    public Gui_1() {
        initComponents();
    }

    // <editor-fold defaultstate="collapsed" desc=" Erzeugter Quelltext ">                          
    private void initComponents() {
        jFileChooser1 = new javax.swing.JFileChooser();
        jButton1 = new javax.swing.JButton();
        mainMenu = new javax.swing.JMenuBar();
        fileMenu = new javax.swing.JMenu();
        openMenuItem = new javax.swing.JMenuItem();

        getContentPane().setLayout(null);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);


        fileMenu.setText("File");
        openMenuItem.setText("Open");
        openMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                openMenuItemActionPerformed(evt);
            }
        });

        fileMenu.add(openMenuItem);

        mainMenu.add(fileMenu);

        setJMenuBar(mainMenu);

        pack();
    }// </editor-fold>                        

    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_1.this);
        if(returnVal == jFileChooser1.APPROVE_OPTION) {
            selectedFile = jFileChooser1.getSelectedFile().getPath();
        }
        File imageFile = new File(selectedFile);
        try {
            image = ImageIO.read(new File(selectedFile));
            imageComponent = new ImageComponent_1(image);
        } catch(IOException e) {
            System.out.println(e.toString());
        }
        showPicture(imageComponent);
    }                                            

    private void showPicture(ImageComponent_1 imageComp) {
        getContentPane().add(imageComp);
        component = getContentPane().getComponents();
        System.out.println(component[0].getName());
        pack();
        validate();
    }

    
    // Variablendeklaration - nicht modifizieren                     
    private javax.swing.JMenu fileMenu;
    private javax.swing.JButton jButton1;
    private javax.swing.JFileChooser jFileChooser1;
    private javax.swing.JMenuBar mainMenu;
    private javax.swing.JMenuItem openMenuItem;
    // Ende der Variablendeklaration                   
    
}
```



```
import java.awt.*;
import javax.swing.JPanel;

public class ImageComponent_1 extends JPanel {
    
    private Image image;
    
    public ImageComponent_1(Image image) {
        this.image = image;
    }
    
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(image.getWidth(null), image.getHeight(null));
    } 
    
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image,0,0,this);
    }    
}
```

Aufgerufen wird der Frame über:


```
public class Main {
    
    private static Gui_1 g = new Gui_1();
    
    public Main() {
    }

    public static void main(String[] args) {
        g.setVisible(true);
        g.setSize(640,480);
        g.setLocation(20,20);
    }
    
}
```

Mittels showPicture() versuche ich das Bild zum Frame hinzuzufügen, was aber wie gesagt nicht klappt. Dann habe ich zur Überprüfung einfach mal System.out.println(component[0].getName()); eingebaut, was eigentlich den Namen der Komponenten "imageComp" zurückliefern sollte, aber zu meiner Verwunderung kam als Ausgabe schlicht "null". Die Komponente scheint also gar nicht hinzugefügt worden zu sein.

Ich hab in letzter Zeit viel ausprobiert und zig Beispiele gelesen, wie man Bilder mit Java anzeigen kann, aber eine Erklärung warum es bei mir nicht geht kann ich einfach nicht finden.


Schon mal vielen Dank für jede Hilfe.


----------



## SlaterB (16. Aug 2007)

> was eigentlich den Namen der Komponenten "imageComp" zurückliefern sollte

warum zum Himmel sollte das passieren? hast du irgendwo den Namen gesetzt?


```
public ImageComponent_1(Image image)
    {
        this.image = image;
        setName("name");
    }
```

verlässlicher ist vielleicht eh:
System.out.println("imageComp   : "+imageComp.hashCode());
        System.out.println("component[0]: "+component[0].hashCode());

damit findest du auch immer Fehler die dadurch entstehen, dass du mehrere Komponenten (z.B. gleichen Namens) erstellst


hätte das einfügen nicht geklappt, wäre übrigens component[0] selber null -> NullPointerException,
also ist der ganze Test so wie er da steht etwas seltsam


-----------

Fehler hier scheint
getContentPane().setLayout(null); 
zu sein,
wirf dann raus, dann gehts hoffentlich


----------



## minos5000 (16. Aug 2007)

SlaterB hat gesagt.:
			
		

> > was eigentlich den Namen der Komponenten "imageComp" zurückliefern sollte
> 
> warum zum Himmel sollte das passieren? hast du irgendwo den Namen gesetzt?


Ich dachte er spuckt mir dann einfach den Namen den Namen aus, unter dem ich das Objekt angelegt habe.




			
				SlaterB hat gesagt.:
			
		

> Fehler hier scheint
> getContentPane().setLayout(null);
> zu sein,
> wirf dann raus, dann gehts hoffentlich



Danke für den Tipp, das gung ja ruck-zuck . Das blöde bei NetBeans ist, daß man immer ein Layout setzen MUSS. Ist ein Layout vorhanden scheint aber der Befehl

```
getContentPane().add(...)
```
nicht mehr wie gewohnt zu funktionieren, da man nur noch Objekte gemäß dem gewählten Layout hinzufügen kann. Was bei dem Standardlayout von NetBeans (GroupLayout) nicht möglich zu sein scheint.

Ich hatte gehofft, durch setzen eines Null-Layouts den Effekt zu erreichen, daß getContentPane().add() wieder funktioniert, was aber wie zu sehen war, leider nicht ging.

Um deinen Tipp umzusetzen hab ich den gesamten Code in einen Editor kopiert, setLayout(null) auskommentiert und beim anschließenden Test wurde auch prompt ein Bild angezeigt.


Jetzt werde ich erstmal versuchen mich irgendwie mit dem Layoutverhalten von NetBeans zu arrangieren, um die gewünschten Ergebnisse zu erzielen.


----------

