# Fenstergrösse an Bild anpassen



## Megara (22. Nov 2011)

Hallo,

Habe folgendes Problem. Kann über den JFileChooser ein Bild auswählen welches in einem neuen Fenster geöffnet werden soll. Nur bekomme ich das nicht hin dass das Fenster sich der Bildgrösse anpasst.

Bildfenster.java

```
import java.io.File;

import javax.swing.JFrame;


public class BildFenster extends JFrame {
		
	public BildFenster(File Datei){
		
		setTitle(Datei.getPath());
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		setBounds(50,50,450,300);
		setVisible(true);
		
		ViewComponent viewComponent = new ViewComponent();
		setBounds(50,50,450,300);
		add(viewComponent);
		viewComponent.setImage(Datei);
	}
}
```

ViewComponent.java

```
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.io.File;

import javax.swing.JComponent;

class ViewComponent extends JComponent
{
  private Image image;
  
  public void setImage(File file)
  {
	  image = Toolkit.getDefaultToolkit().getImage(file.getPath());
	  if (image != null){
		  repaint();
	  }
  }
  
  @Override
  protected void paintComponent(Graphics g)
  {
    if (image!=null){
    	g.drawImage(image,0,0,image.getWidth(this),image.getHeight(this),this);
    }   
  }
  
  public int getBreite(){
	return image.getWidth(null);
  }
}
```

Folgende Methode liefert mir ne Fehlermeldung


> ```
> public int getBreite(){
> return image.getWidth(null);
> }
> ```



Danke für eure Hilfe
Gruss,
Megara


----------



## Gast2 (22. Nov 2011)

Was für nen Fehler bekommst du? Ist zu dem Zeitpunkt image schon gesetzt?

In deinem geposteten Code wird die Methode nirgends aufgeruft.


----------



## Megara (22. Nov 2011)

```
import java.io.File;
 
import javax.swing.JFrame;
 
 
public class BildFenster extends JFrame {
        
    public BildFenster(File Datei){
        
        setTitle(Datei.getPath());
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        setVisible(true);
        
        ViewComponent viewComponent = new ViewComponent();
        setBounds(50,50,viewComponent.getBreite(),300);
        add(viewComponent);
        viewComponent.setImage(Datei);
    }
}
```

Fehlermeldung:


> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
> at ViewComponent.getBreite(ViewComponent.java:29)
> at BildFenster.<init>(BildFenster.java:16)
> at MainWindow$2.actionPerformed(MainWindow.java:62)
> ...


----------



## Gast2 (22. Nov 2011)

```
ViewComponent viewComponent = new ViewComponent();
        setBounds(50,50,viewComponent.getBreite(),300);
        add(viewComponent);
        viewComponent.setImage(Datei);
```
Das ist ja schon wieder nen anderer Code als den den du oben gepostet hast.
Hier rufst du setImage ganz zum schluss aus. Vorher aber schon getBreite(), zu dem Zeitpunkt ist image noch null und dir fliegt die Exception um die Ohren.
Setz das image direkt nach dem Erstellen der Instanz oder baue auch bei getBreite() ne null Prüfung ein.


----------



## Megara (23. Nov 2011)

Das hätte mir auch selbst auffallen können. Da muss ich mich an meiner eigenen Nase packen xD
Habe das jetzt angepasst. Jetzt liegt das Problem dabei dass ich für die Breite -1 rausbekomme. ???:L


----------



## bERt0r (23. Nov 2011)

Nur mal interessehalber, was soll dein ViewComponent genau machen? Wenn er nur ein Bild anzeigen soll, bist du mit einem JLabel besser bedient. Dem gibst du einfach das Image als Icon verpackt, fügst das Label deinem Frame hinzu und machst ein pack().


```
public MyFrame()
{
JLabel label=new JLabel(new ImageIcon("meinImage.jpg"));
this.add(label);
this.pack();
}
```

How to Use Labels (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## Schrubber (23. Nov 2011)

-1 kommt heraus, wenn etwas null ist.


----------



## Gast2 (23. Nov 2011)

Eher wenn die Komponente noch nicht sichtbar ist.


----------



## Megara (23. Nov 2011)

bERt0r hat gesagt.:


> Nur mal interessehalber, was soll dein ViewComponent genau machen? Wenn er nur ein Bild anzeigen soll, bist du mit einem JLabel besser bedient. Dem gibst du einfach das Image als Icon verpackt, fügst das Label deinem Frame hinzu und machst ein pack().
> 
> 
> ```
> ...



Das mit dem ViewComponent ist ein angepasster Quellcode aus Java ist auch eine Insel. Habe das mit dem Label übernommen. Habe jetzt noch das Problem dass ich jedes mal ein neues Fenster bekomme wenn ich ein weiteres Bild öffne. Wie kann ich das realisieren dass das Bild im bereits vorher geöffneten Fenster angezeigt wird?


----------



## bERt0r (23. Nov 2011)

How to Use Labels (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## Megara (24. Nov 2011)

Habe es mal hinbekommen dass das gleiche Fenster bleibt und die Größe für das neue Bild gesetzt wird nur das Bild wird nicht korrekt angezeigt.


```
final BildFenster BF = new BildFenster();
		
		JMenuItem mntmBildOeffnen = new JMenuItem("Bild \u00F6ffnen");
		mntmBildOeffnen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				BildOeffnen Datei = new BildOeffnen();
				File BildDatei = Datei.getBild();
				if(BildDatei!=null){
					BF.setBild(BildDatei);
				}	
			}
		});
		mnDatei.add(mntmBildOeffnen);
```


```
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class BildFenster extends JFrame {
		
	public void setBild(File Datei){
		setTitle(Datei.getPath());
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		setVisible(true);
		JLabel label=new JLabel(new ImageIcon(Datei.getPath()));
		this.add(label);
		this.pack();
	}
}
```


----------



## bERt0r (24. Nov 2011)

Ein bisschen mehr lesen und weniger Try and Error wäre angebracht. Dann hättest du diese Funktion von JLabel gesehen: 





> setIcon
> 
> public void setIcon(Icon icon)
> 
> ...



Du fügst ja bei jedem setBild ein neues JLabel hinzu. Du solltest das JLabel im Konstruktor deines Frames erstellen (mit new) und wenn du das Bild verändern willst, machst du setIcon drauf.


----------



## Megara (24. Nov 2011)

Danke für deine Hilfe.

Es gibt nur noch eine Kleinigkeit die mir gerade Kopfzerbrechen bereitet. Wie kann ich im Hauptframe auf das Bild vom zweiten Fenster zugreifen um zum Beispiel die RGB-Werte auszulesen?

Wenn ich das Problem gelöst ist dann kann ich den Thread als erledigt markieren.


----------



## bERt0r (24. Nov 2011)

Indem du eine get Funktion schreibst.


----------

