Fenstergrösse an Bild anpassen

Megara

Mitglied
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
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
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
Java:
  public int getBreite(){
	return image.getWidth(null);
  }

Danke für eure Hilfe
Gruss,
Megara
 
Was für nen Fehler bekommst du? Ist zu dem Zeitpunkt image schon gesetzt?

In deinem geposteten Code wird die Methode nirgends aufgeruft.
 
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);
        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)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
 
Java:
        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.
 
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
 
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().

Java:
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)
 
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().

Java:
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)

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?
 
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.

Java:
		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);

Java:
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();
	}
}
 
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)

Defines the icon this component will display. If the value of icon is null, nothing is displayed.

The default value of this property is null.

This is a JavaBeans bound property.

See Also:
setVerticalTextPosition(int), setHorizontalTextPosition(int), getIcon()

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.
 
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.
 

Neue Themen


Zurück
Oben