# eigenen Button in JFileChooser einfügen



## jueki (23. Aug 2010)

Hallo,
ich habe eine von JFileChooser abgeleitete eigene Klasse. In die Oberfläche des Filechoosers würde ich gerne einen eigenen, zusätzlichen Button neben den Cancel- und OK-Buttons einfügen. Wenn ich aber einfach mit this.add(...) einen Button einfüge landet er immer fensterfüllend auf dem Browser-tree-label. Ich vermute, ich brauche eine Referenz auf ein tiefer liegendes JPanel oder sonstwas?

jueki

zur verdeulichung hier zusammengefasst mein Code:


```
public class myFileChooser extends JFileChooser
{
	// ... blablabla ...
	private JButton m_btMyButton = null;
	
	// Button initialisieren ...
	private JButton getMyButton()
	{
		if (m_btMyButton == null)
		{
			m_btMyButton = new JButton();
			m_btMyButton.setLocation(10, 10);
			m_btMyButton.setSize(75, 15);
			m_btMyButton.setName("my Button");
			m_btMyButton.setVisible(true);
		}
		return m_btMyButton;
	}

	// Konstruktor ...
	public myFileChooser() throws Exception
	{
		super();
		

		this.add(getMyButton()); // <- !?!?
		

                setFileSelectionMode(JFileChooser.FILES_ONLY);
                setAcceptAllFileFilterUsed(false);
		
                // ... blablabla ...
        
                this.showOpenDialog(null);
	}
	
    // ... blablabla ...
}
```


----------



## jueki (24. Aug 2010)

Haaaaaallo ...
bin ich den ganz alleine hier?
Ist das Thema zu trivial oder zu anspruchsvoll?
Weiß niemand was dazu zu sagen?

jueki


----------



## diggaa1984 (24. Aug 2010)

such dir ne antwort aus, aber ich wüsste selber auch nich wo ich da anseetzen soll, der aufbau der gui ist ja doch recht versteckt vermute ich mal, so easy wirst da nich rankommen


----------



## diggaa1984 (24. Aug 2010)

google hat mir grad sowas rausgespruckt: Java Socket Programming: JFileChooser - adding button - java.itags.org

und nen kleiner Blick in die API brachte noch sowas:


> public void setAccessory(JComponent newAccessory)
> Sets the accessory component. An accessory is often used to show a preview image of the selected file; however, it can be used for anything that the programmer wishes, such as extra custom file chooser controls.
> 
> Note: if there was a previous accessory, you should unregister any listeners that the accessory might have registered with the file chooser.



probiert hab ich nix, aber vielleicht kannst selber damit rumspielen


----------



## XHelp (24. Aug 2010)

Je nach dem wofür du es brauchst. Du könntest natürlich auch so einen ganz durty hack nehmen:

```
JFileChooser fileChooser = new JFileChooser(".");
JPanel panel1 = (JPanel) fileChooser.getComponent(3);
JPanel panel2 = (JPanel) panel1.getComponent(3); 
panel2.add(button);
```


----------



## jueki (25. Aug 2010)

Danke erst mal für die Antworten,

den Code aus dem Link: 





> google hat mir grad sowas rausgespruckt: Java Socket Programming: JFileChooser - adding button - java.itags.org


 habe ich mal ausprobiert. Ist im Prinzip genau das, was ich auch schon gemacht habe, nur dass der Button mit der Option "BorderLayout.EAST" eingefügt wird - funktioniert aber nicht. (Zumindest bei mir.)



> Je nach dem wofür du es brauchst. Du könntest natürlich auch so einen ganz durty hack nehmen:


Prima, ich habe zwar keinen Plan, warum ausgerechnet 2 mal 
	
	
	
	





```
.getComponent(3)
```
 aber es macht genau dass was ich wollte. 

jueki


----------



## jueki (25. Aug 2010)

Ach ja, hier noch ein funktionsfähiger Beispielcode, falls für jemanden von Interesse:
(gemixt aus dem Link von "diggaa1984" und "XHelp")


```
import java.io.File;
import javax.swing.*;

public class myFileChooser
{

	static JButton button = new JButton("My button"); //--your button

	public static void main(String args[])
	{

		SwingUtilities.invokeLater(new Runnable()
		{

			public void run()
			{

				JFileChooser fileChooser = new JFileChooser(".");
				JPanel panel1 = (JPanel) fileChooser.getComponent(3);
				JPanel panel2 = (JPanel) panel1.getComponent(3); 
				panel2.add(button);

				int status = fileChooser.showOpenDialog(null);

				if (status == JFileChooser.APPROVE_OPTION)
				{

					File selectedFile = fileChooser.getSelectedFile();
					System.out.println("Selected: "
							+ selectedFile.getParent()
							+ " "
							+ selectedFile.getName());
				}

				System.exit(0);

			}

		});

	}

}
```


----------



## diggaa1984 (25. Aug 2010)

> Prima, ich habe zwar keinen Plan, warum ausgerechnet 2 mal .getComponent(3) aber es macht genau dass was ich wollte



dann du dir noch den gefallen und find heraus was getComponent macht und was du in den einzelnen Aufrufen jeweils bekommst


----------

