# Höhe eines Buttons festlegen



## Bartleby (1. Okt 2008)

Hallo,

ich bin gerade dabei zu verzweifeln  :bahnhof: Eigentlich habe ich nur ein ganz kleines Anliegen, aber wahrscheinlich sehe ich gerade den Wald vor lauter Bäumen nicht. Ich möchte die Höhe eines JButtons festlegen, die Breite soll aber dynamisch angepasst werden.
Wenn ich button.setPreferredSize(new Dimension(5,15)) verwende, wird der Button auch 5x15cm gezeichnet. Die Breite kenne ich aber nicht, also nehme ich button.setPreferredSize(new Dimension(0,15)) - jetzt wird aber eine Breite von 0px statt der benötigten Breite verwendet, wie ich es gehofft hatte. Die benötigte Breite kann ich auch nicht erfragen, da ein button.getWidth() beim ersten Mal 0px liefert, da der Button ja noch nie gezeichnet wurde.
Verwende ich hingegen button.setSize(new Dimension(0,15)), wird die Breite zwar dynamisch angepasst, aber die Höhe ist nicht 15, sondern 25px  ???:L 
Wie ihr seht, stehe ich gerade voll auf dem Schlauch. Wie bekomme ich den Button niedriger?


```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestToolbar extends JPanel {
	public static void main(String[] args) throws Exception {

		final JFrame frame = new JFrame("TestToolbar");
		frame.setBounds(20, 20, 800, 400);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final TestToolbar panel = new TestToolbar();

		frame.setContentPane(panel);
		frame.setVisible(true);
	}

	private TestToolbar() throws Exception {
		setLayout(new FlowLayout());
		setBackground(Color.yellow);
		
		JButton b = new JButton("text");
		b.setSize(new Dimension(0,15));
//		b.setPreferredSize(new Dimension(0,15));
//		b.setMinimumSize(new Dimension(0,15));
//		b.setMaximumSize(new Dimension(0,15));
		add(b);
	}
}
```


----------



## 0001001 (1. Okt 2008)

Hilft dir das weiter:

```
import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Demo extends JFrame{
    public Demo(){
    	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	JButton b = new JButton("text");
    	
    	b.setPreferredSize(new Dimension(500000,15));

        this.add(b, BorderLayout.NORTH);
        this.pack();
        this.setSize(800, 600);
        this.setVisible(true);
        System.out.println(b.getSize());
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable()   {
                public void run() {
                    new Demo();
                }
        });
    }
}
```

Dadurch passt sich die Breite an die durch den LayoutManager zur Verfügung gestellte Breite an. Die Höhe ist auf 15px begrenzt.


----------



## Bartleby (2. Okt 2008)

Vielen Dank für den Tipp, allerdings ist es nicht ganz das, was ich suche.

Wenn ich keine *size-Einstellungen mache, ist die Größe des Buttons vom LayoutManager bestimmt und z.B. 50x25. Nun möchte ich die Größe aber so beeinflussen, dass der Button nur 15px hoch ist, also 50x15. Ist der Text im Button nun länger, kann der Button auch 60x15 sein, oder wenn der Text kürzer ist, 40x15. Aber IMMER 15px hoch!

Verstehst du was ich meine? Die benötigte Breite kenne ich aber nicht, deshalb kann ich sie mit setPreferredSize(w,h) nicht setzen. Die einzige Möglichkeit die mir einfällt, ist es, die Breite manuell zu berechnen. Also Breite des Fonts + ggf. Iconbreite + ggf. Abstand zw. Icon u. Text + ggf. Insets + ggf. Breite des Rahmens... Das erscheint mir aber ziemlich umständlich. Gibt es da keine einfachere Möglichkeit?


----------



## Gast (2. Okt 2008)

Hallo

Hol dir doch die Grösse des Buttons per getPreferedSize().width, bevor du die Grösse änderst.

Beispiel:
button.setPreferedSize(
new Dimension(button.getPreferedSize().width, [hier deine Höhe]) )


----------



## Bartleby (2. Okt 2008)

Das funktioniert leider nicht, da die PreferredSize 0x0 so lang sie nicht gesetzt wurde und auch die Size beim aller ersten Mal 0x0 ist, so lang der Button nicht gezeichnet wurde. Somit müsste ich den Button zweimal zeichnen...

Ich habe das Problem jetzt aber so gelöst, indem ich eine eigene Button-Klasse erstelle, die nur die Methode getMaximumSize() überschreibt. Diese ruft super.getMaximumSize() auf und bekommt damit die richtige Breite. Zurück gebe ich diese Breite mit meiner festgelegten Höhe von 15. Zwar etwas umständlich, aber es funktioniert.


----------



## Marco13 (2. Okt 2008)

Ja, so ähnlich wäre jetzt auch mein Ansatz gewesen. Ich hätte aber keine "echte" eigene Klasse dafür erstellt, sondern das durch eine anonyme Klasse geregelt ... ganz grob in etwa so

```
class Application
{
    void init()
    {
        JButton button0 = createConstrainedHeightButton(15, "Hallo");
        JButton button1 = createConstrainedHeightButton(15, "Welt");
    }

    private JButton createConstrainedHeightButton(final int height, String text)
    {
        JButton result = new JButton(text)
        {
            public Dimension getPreferredSize()
            {
                 Dimension dim = super.getPeferredSize();
                 dim.height = height;
                 return dim;
            }
        };
        return result;
    }
}
```
... so in etwa... könnte funktionieren....


----------



## Bartleby (2. Okt 2008)

Jup, so gehts natürlich auch. Da ich den Button aber an verschiedenen Ecken benötige, ist eine "echte" Klasse dafür besser geeignet.

Dein Ansatz hat nur einen kleinen Fehler: 
	
	
	
	





```
super.getPeferredSize()
```
 liefert 0x0 zurück, so lang du nicht selbst die PrefSize gesetzt hast (was ja nicht geht)! 
Deshalb ist die einzige Möglichkeit mit 
	
	
	
	





```
super.getMaximumSize()
```
 zu arbeiten.


----------



## Marco13 (2. Okt 2008)

Bartleby hat gesagt.:
			
		

> Dein Ansatz hat nur einen kleinen Fehler:
> 
> 
> 
> ...



Nö, getPreferredSize liefert die Preferred Size. Deswegen auch der Name :wink: Wenn man die preferred size nicht explizit gesetzt hat, wird sie aus dem Inhalt der Component (d.h. im Fall eines Buttons: Aus dem enthaltenen Text und Icon) berechnet. Wenn dort 0,0 geliefert wird, dann vmtl. weil der Button noch nicht "realized" ist.


----------

