# JFrame in der Laufzeit verändern



## hans_müller (21. Mai 2011)

Hey,

ich möchte gerne während der laufzeit in mein JFrame einen JButton hinzufügen.
Nämlich besteht mein JFrame zunächst nur aus einem JButton. Nachdem anklicken wird der JFileChooser aufgerufen und wenn dort ein Bild.png geöffnet wurde soll meinem JFrame zusätzlich  noch ein JButtonhinzugefügt werden(nur für das verständnis).


```
public class Test extends JFrame {

	public Test() {
		this.init();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setSize(800, 400);
		setLocationRelativeTo(null);
	}

	public void init() {
		JButton schaltflaeche = new JButton("Vorher");
		schaltflaeche.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				test();
			}
		});
		this.add(schaltflaeche);
	}
	
	public void test() {
		FileFilter filter = new FileNameExtensionFilter("PNG-Bilder", "png");
		JFileChooser chooser = new JFileChooser("");
		chooser.addChoosableFileFilter(filter);
		int tmp = chooser.showDialog(null, "Bild aussuchen");
		if(tmp == JFileChooser.APPROVE_OPTION)
        {
          this.add(new JButton("Nachher"));  //das funktioniert leider nicht
        }
	}
	public static void main(String[] args) {
		Test fenster = new Test();
		fenster.setVisible(true);
	}
}
```

Gruß Markus


----------



## Kr0e (21. Mai 2011)

Ohne jetzt genauer drauf einzugehen, würde ich mal ganz oberflächlich vermuten, dass dein JFileChooser nicht "APPROVE_OPTION" zurückgibt... Ansonsten könnte es vlt an einem fehlenden LayoutManager liegen, der dafür benutzt wird, um Komponenten anzuordnen...


----------



## Gast2 (21. Mai 2011)

du musst deinem JFrame sagen dass es sich neu layouten soll nachdem du den Button hinzugefügt hast:


```
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Test extends JFrame {
 
    public Test() {
    	setLayout(new FlowLayout());
        this.init();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
    }
 
    public void init() {
        JButton schaltflaeche = new JButton("Vorher");
        schaltflaeche.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                test();
            }
        });
        this.add(schaltflaeche);
    }
    
    public void test() {
        FileFilter filter = new FileNameExtensionFilter("PNG-Bilder", "png");
        JFileChooser chooser = new JFileChooser("");
        chooser.addChoosableFileFilter(filter);
        int tmp = chooser.showDialog(null, "Bild aussuchen");
        
        if(tmp == JFileChooser.APPROVE_OPTION) {
        	add(new JButton("Nachher"));  //das funktioniert leider nicht
        	invalidate();
        	pack();
        }
    }
    public static void main(String[] args) {
        Test fenster = new Test();
        fenster.setVisible(true);
    }
}
```


----------



## hans_müller (21. Mai 2011)

also wenn ich die zeile 29 mit

```
System.out.println(chooser.getSelectedFile().getAbsolutePath());
```
ersetze bekomme ich den pfad, also denke ich dass er immerhin drauf reagiert.


----------



## hans_müller (21. Mai 2011)

okay vielen dank, muss ich dann nachdem  

```
invalidate();
```
nochmal neu 

```
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	pack();
	setSize(800, 400);
	setLocationRelativeTo(null);
```

festlegen?Anscheinend übernimmt er bei diesem befehl nicht die festgelegten sachen im konstruktor.


----------



## hans_müller (21. Mai 2011)

Danke für die Hilfe!
Nun versuche ich das bild einzulesen und als JPanel in mein JFrame hinzuzufügen.
Dabei soll das bild auf 150x150 verkleinert werden.


```
public class ListDialog extends JFrame {

	BufferedImage image;
	public ListDialog() {
		this.init();
		fix();
	}
	
	private void fix(){
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setSize(800, 400);
		setLocationRelativeTo(null);
	}

	public void init() {
		setLayout(new FlowLayout());
		JButton schaltflaeche = new JButton("Vorher");
		schaltflaeche.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				test();
			}
		});
		this.add(schaltflaeche);
		
	}
	
	public void test() {
		FileFilter filter = new FileNameExtensionFilter("PNG-Bilder", "png");
		JFileChooser chooser = new JFileChooser();
		chooser.addChoosableFileFilter(filter);
		int tmp = chooser.showDialog(null, "Bild aussuchen");
		if(tmp == JFileChooser.APPROVE_OPTION)
        {
		File bild = chooser.getSelectedFile();
		try {
			image = ImageIO.read(bild);
			JPanel panel = new JPanel() {
			@Override
			public void paintComponent(Graphics g) {
				g.drawImage(image, 150 , 150, null);  //funktioniert leider nicht
			}
			};
			add(panel); 
			invalidate();
	        fix();
	        
		} catch(IOException e) { }
         
        }
		
	}
	
	public static void main(String[] args) {
		ListDialog fenster = new ListDialog();
		fenster.setVisible(true);
	}
}
```


----------



## Volvagia (21. Mai 2011)

```
public class ListDialog extends JFrame
{
    public ListDialog() {
        this.init();
        fix();
    }
    
    private void fix(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setSize(800, 400); //Zuerst packen und dann selbst die Größe setzen? Oo
        setLocationRelativeTo(null);
    }
 
    public void init() {
        setLayout(new FlowLayout());
        JButton schaltflaeche = new JButton("Vorher");
        schaltflaeche.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                test();
            }
        });
        this.add(schaltflaeche);
        
    }
    
	public void test() {
		FileFilter filter = new FileNameExtensionFilter("PNG-Bilder", "png");
		JFileChooser chooser = new JFileChooser();
		chooser.addChoosableFileFilter(filter);
		int tmp = chooser.showDialog(null, "Bild aussuchen");
		if(tmp == JFileChooser.APPROVE_OPTION)
		{
			File f = chooser.getSelectedFile();
			try
			{
				Image oriImg = ImageIO.read(f);
				final Image img = resizeImg(oriImg, 150, 150);				

				JPanel panel = new JPanel() {
					public void paintComponent(Graphics g) {
						g.drawImage(img, 0 , 0, null);
					}
				};
				add(panel); 
				revalidate();
			} catch(IOException e) { }
		}
	}
	private Image resizeImg(Image src, int w, int h)
	{
		BufferedImage dest = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
		Graphics g = dest.getGraphics();
		g.drawImage(src, 0, 0, w, h, null);
		g.dispose();
		return(dest);
	}
	
    
    public static void main(String[] args) {
        ListDialog fenster = new ListDialog();
        fenster.setVisible(true);
    }
}
```

Vom Hirn in die Tasten. :O


----------



## hans_müller (21. Mai 2011)

schon einmal vielen dank für die antwort, aber das funktioniert so immer noch nicht.
Meinst du in der 46 zeile 
	
	
	
	





```
invalidate();
```
 ?


----------



## Volvagia (21. Mai 2011)

Ups, JFrame besitzt kein revalide.
Außerdem verwendest du einen LayoutManager, der sich an die Size-Eigenschaften hält, vergibst aber keine eigene. Endweder du setzt selbst eine, oder du verwendest einen LayoutManager, der auf andere Sachen schaut. Wie das BorderLayout auf die Größe des Parent.


```
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;

public class ListDialog extends JFrame
{
    public ListDialog() {
        this.init();
        fix();
    }
    
    private void fix(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800, 400);
        setLocationRelativeTo(null);
    }
 
    public void init() {
        setLayout(new BorderLayout());
        JButton schaltflaeche = new JButton("Vorher");
        schaltflaeche.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                test();
            }
        });
        this.add(schaltflaeche, BorderLayout.SOUTH);
        
    }
    
    public void test() {
        FileFilter filter = new FileNameExtensionFilter("PNG-Bilder", "png");
        JFileChooser chooser = new JFileChooser();
        chooser.addChoosableFileFilter(filter);
        int tmp = chooser.showDialog(null, "Bild aussuchen");
        if(tmp == JFileChooser.APPROVE_OPTION)
        {
            File f = chooser.getSelectedFile();
            try
            {
                Image oriImg = ImageIO.read(f);
                final Image img = resizeImg(oriImg, 150, 150);              
 
                JPanel panel = new JPanel() {
                    public void paintComponent(Graphics g) {
                        g.drawImage(img, 0 , 0, null);
                    }
                };
                add(panel, BorderLayout.CENTER); 
                validate();
            } catch(IOException e) { }
        }
    }
    private Image resizeImg(Image src, int w, int h)
    {
        BufferedImage dest = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics g = dest.getGraphics();
        g.drawImage(src, 0, 0, w, h, null);
        g.dispose();
        return(dest);
    }
    
    
    public static void main(String[] args) {
        ListDialog fenster = new ListDialog();
        fenster.setVisible(true);
    }
}
```


----------



## hans_müller (21. Mai 2011)

vielen dank für deine Hilfe, klasse forum!
jetzt ist es leider so das sich das ausgewählte Bild auf 150x150 verkleinert, aber im hintergrund des Bildes ist ein Ausschnitt des JFileChooser xD.
Ich würde gerne das Bid unbearbeitet lassen und einen beliebigen Bildausschnitt  mit 150x150 pixel anzeigen lassen und das ohne den ausschnitt des JFileChoosers.


----------



## hans_müller (21. Mai 2011)

also das Bild wurde aufjedenfall ausgewählt, weil wenn ich zum testen  ein 

```
ImageIO.write(bild,"png", new File("Pfad"))
```
nach dem auswählen des Bildes hinzufüge wird das Bild erneut erstellt.
Hoffe mir kann helfen,
Gruß Markus


----------



## Volvagia (21. Mai 2011)

Versuch mal nach den val. ein repaint aufzurufen.


----------

