# TextArea Größe festlegen



## Zaphi67 (3. Apr 2009)

Wie kann ich meiner TextArea eine feste Größe zuordenen?
mit set.Size gehts irgenwie nicht.
[HIGHLIGHT="Java"]import javax.swing.*;
import java.awt.*;

public class Startscreen {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String ls = System.getProperty("line.separator");
		String text = "Bitte lesen sie sich die Nuzungbedingungen durch"+ls+ls+
		"Hier stehen dieNuzungbedingungen"; 
		JFrame start = new JFrame("Marko`s Java Quiz");
		start.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		start.setSize(500, 300);
		start.setLocationRelativeTo(null);
		start.setResizable(false);
		start.getContentPane().setLayout(new FlowLayout());

		JTextArea terms = new JTextArea(text);
		terms.setSize(450,200);
		start.add(terms);
		JCheckBox check = new JCheckBox("ich akzeptiere die Lizensbedingungen");
		start.add(check);
		JButton ok = new JButton("OK");
		start.add(ok);


		start.setVisible(true);

	}

}
[/HIGHLIGHT]


----------



## Developer_X (3. Apr 2009)

weißt du wieso?
Weil du Layouts benutzt!
Und wie ich immer sage, bounds sind am besten, so sollte es gehen:
[highlight=Java]
import javax.swing.*;
import java.awt.*;

public class Startscreen {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String ls = System.getProperty("line.separator");
        String text = "Bitte lesen sie sich die Nuzungbedingungen durch"+ls+ls+
        "Hier stehen dieNuzungbedingungen"; 
        JFrame start = new JFrame("Marko`s Java Quiz");
        start.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        start.setSize(500, 300);
        start.setLocationRelativeTo(null);
        start.setResizable(false);

        JTextArea terms = new JTextArea(text);
terms.setBounds(0,0,/*X*/,/*Y*/);        
        start.add(terms);
        JCheckBox check = new JCheckBox("ich akzeptiere die Lizensbedingungen");
check.setBounds(0,0,/*X*/,/*Y*/);
        start.add(check);
        JButton ok = new JButton("OK");
        start.add(ok);


start.setLayout(null);
        start.setVisible(true);

    }

}
[/highlight]

ALSO IMMER DRAN DENKEN!!!
MIT BOUNDS KANN MAN DIE GENAUE POSITION UND GRÖßE ALLER OBJEKTE, IN EINER SICHTBAREN APPLIKATION FESTHALTEN!


----------



## SlaterB (3. Apr 2009)

nicht drauf hören, 
bei Layouts heißt das
terms.setPreferredSize(new Dimension(450, 200));


----------



## tfa (3. Apr 2009)

Hör bloß nicht auf diesen Unsinn. Verwende einen vernünftigen Layoutmanager und versuche nicht, absolute Pixelgrößen festzulegen.


----------



## Zaphi67 (3. Apr 2009)

> weißt du wieso?
> Weil du Layouts benutzt!
> Und wie ich immer sage, bounds sind am besten, so sollte es gehen:


Hmmm..bei meinem letztenProjekt wurde mir strickt abgeraten mit Bounds zu arbeiten und eben diese Layoutmaneger zu nutzen. Obwohl ich mit den Bound eigentlich ganz gut zurecht kam.
Na mal abwarten. Vieleicht kommen ja noch mehr  Beiträge.
Trotzdem schonmal Danke


----------



## Developer_X (3. Apr 2009)

SlaterB hat gesagt.:


> nicht drauf hören,
> bei Layouts heißt das
> terms.setPreferredSize(new Dimension(450, 200));



achja?
er kann aber mit meinem auch die genaue Position festlegen, welches für ihn sicherlich sehr wertvoll ist.


----------



## Developer_X (3. Apr 2009)

ich versteh zwar dass ihr alle diese Layouts besser findet, aber bei setBounds ist es so, dass man ja mit der Funktion eines Toolkits spielen kann, also getScreenSize diese kann man dann dividieren, addieren, multiplizieren, subrathiere etc...


----------



## SlaterB (3. Apr 2009)

die Layouts wurden bewußt eingeführt um genau das nicht mehr machen zu müssen 

es ist gut, damit zu experimentieren, das kennenzulernen,
aber spätestens wenn du zum dritten Mal eine Menge von x Buttons ordentlich in eine Reihe anordnen musst,
willst du das nicht mehr Pixel für Pixel für jeden Button machen

du kannst nun sagen, dass man sich dafür eine Schleife schreiben kann,
Bounds von Button n = Bounds von vorherigen Button  +10

tja, und GENAU DAS sind dann die Layouts


----------



## Leroy42 (3. Apr 2009)

Zaphi67 hat gesagt.:


> Na mal abwarten. Vieleicht kommen ja noch mehr  Beiträge.



Okay! Hier mein Post:

Hör nicht auf Developer_X bezüglich seiner Empfehlung des Nulllayouts. ueh:

Ein( oder mehrere verschachtelte) _richtige_ Layout(s) bringen 
wesentlich bessere Resultate!


----------



## tfa (3. Apr 2009)

Für komplexere GUIs ist TableLayout ganz praktisch. Das ist einfacher als GridBagLayout aber trotzdem recht mächtig.


----------



## Developer_X (3. Apr 2009)

naja, vielleicht schreibe ich mal mein eigenes Layout, wenn es nicht zu viel Arbeit seien sollte,
ich trau mir das aber noch nicht zu


----------



## Schandro (3. Apr 2009)

Developer_X hat gesagt.:


> naja, vielleicht schreibe ich mal mein eigenes Layout, wenn es nicht zu viel Arbeit seien sollte,
> ich trau mir das aber noch nicht zu


Das heißt du glaubst jetzt doch daran, das LayoutManager besser sind, willst dich aber nicht in einen bereits exisiterenden hineinarbeiten sondern lieber einen eigenen schreiben?   
 0,5 *:applaus:


----------



## Developer_X (3. Apr 2009)

ja, weil mir die jetztigen Layouts immer noch zu ungenau sind


----------



## icarus2 (3. Apr 2009)

Ämm, also ich bin ein absoluter Fan von GridBagLayout für kompliziertere grafische Oberflächen. Es ist das erste mal etwas mühsam sich damit zurecht zu finden, aber mit der Zeit geht es schon.

Damit man etwas ProgrammCode sparen kann schreibe ich jeweils eine Methode, die das GridBagConstraints-Objekt zurückgibt. Innerhalb der Methode wird das, was alle Komponenten gemeinsam haben zugeordnet.

Das sieht dann etwas so aus:

Im Konstruktor z.B.:

```
....

GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
c.setLayout(gbl);

einAusgabePanel = new JPanel();
einAusgabePanel.setLayout(new GridLayout(1,0));
gbc = makeContainerGbc(0,0,1,1);
gbc.weightx = 1;
gbc.weighty = 0;
gbc.fill = GridBagConstraints.HORIZONTAL;
 bl.setConstraints(einAusgabePanel, gbc);

....
```

Dazu die Methode:


```
public GridBagConstraints makeContainerGbc(int x, int y, int width, int height){
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx = x;
    gbc.gridy = y;
    gbc.gridwidth = width;
    gbc.gridheight = height;
    gbc.insets = new Insets(3,3,3,3);
    
    return gbc;
  }
```

Nur so als kleine Idee.

Ist ein älteres Projekt... man sollte den Code natürlich nicht in Denglisch haben, sollte nur ein Beispiel sein, wie man eine Methode dazu schreiben kann ;-)

Hoffe mal, das hat seine Richtigkeit ^^


----------



## SlaterB (3. Apr 2009)

ich habe auch im GridBagLayout in einer neue BasisKlasse die von JPanel erbt und dann Methoden zur Verfügung stellt wie
addFillLine(y,JComponent);
addEast(x,y,String); // erstellt automatisch ein JLabel

da kann man wirklich eine Menge Code sparen,
aber das spricht nicht gegen andere Layouts wie TableLayout,

man muss immer schauen, ob man nicht selber gerade die Möglichkeiten des anderen Layouts nachbaut


----------



## icarus2 (3. Apr 2009)

Nur kurz zu deiner eigenen Klasse Slater...

du leitest dann deine Klasse, die du für das Programm hast von deiner eigenen Klasse ab. Da diese (deine selber zuvor erstellte Klasse) von JPanel erbt steht dann in deinem Projekt trotzdem alles von JPanel zur Verfügung oder?

Ist natürlich ne schicke sache ne eigene Klasse, hab ich mich bis jetzt noch nicht rangetraut ;-)


----------



## Zaphi67 (3. Apr 2009)

SlaterB hat gesagt.:


> nicht drauf hören,
> bei Layouts heißt das
> terms.setPreferredSize(new Dimension(450, 200));


Ich hab mich dafüretschieden.Da funzt super.
Danke.
Vieleicht hat noch jemand nen Tip wie ich die CheckBox linksbündig unter die TextArea bekomme und den OkButton rechtsbündig. Ich meine ohne viel Tamtam. Wenns nicht anders geht dannmach ich mir nen Panel mit BorderLayout.Geht aber bestimmt auch einfacher.


----------



## SlaterB (3. Apr 2009)

> steht dann in deinem Projekt trotzdem alles von JPanel zur Verfügung oder?

so ist das bei Vererbung

-------

@Zaphi67
ohne GridBagLayout bzw. äquivalentes fällt mir dazu nix ein, du willst ja sicher nicht hier auch Breite angeben
(CheckBox 250, Button 200 bzw. CheckBox 50, 350 leer, Button 50), das wäre dann ja fast schon setBounds


----------



## icarus2 (3. Apr 2009)

Gut, hab ich mir gedacht... wollte jedoch nur sicher sein ;-)

Ich glaub ich mach auch ma sowas zum Teste, hatte die Idee selber noch nie, aber finde sie sehr gut


----------



## Zaphi67 (3. Apr 2009)

SlaterB hat gesagt.:


> > steht dann in deinem Projekt trotzdem alles von JPanel zur Verfügung oder?
> 
> so ist das bei Vererbung
> 
> ...



Kann man da nicht was mit get.position und set.Position machen?
Also so ungefähr:
get.Position(textArea)
checkBox.set.Position(linksbündigTextarea)
oder so???
Sorry..bin voll der Anfänger.Ich wurschtel mich da so durch.


----------



## Ebenius (3. Apr 2009)

Ein bisschen off topic: Woher kommen diese Punkte "get.Position", "set.Position"? Sieht sonderbar aus.

Ebenius


----------



## Schandro (3. Apr 2009)

> Damit man etwas ProgrammCode sparen kann schreibe ich jeweils eine Methode, die das GridBagConstraints-Objekt zurückgibt. Innerhalb der Methode wird das, was alle Komponenten gemeinsam haben zugeordnet.





> ....
> 
> GridBagLayout gbl = new GridBagLayout();
> GridBagConstraints gbc = new GridBagConstraints();
> ...


Ich verstehs nicht wie man solchen Code schreiben kann. Da kommt man doch (bei noch en paar mehr Components) extrem schnell durcheinander, welche Attribute das gbc Object gerade hat. Und sobald man mal ein Wert ändern will, muss man gucken ob dieser auchnoch weiter unten im Code benutzt wird und dann gegebenfalls wieder zurückändern usw... 
Imho Inkonsistent

Ich mach immer, wenn ich das GridBagLayout benutze, wenn überhaupt das hier:
[highlight=Java]

                                   JLabel titleLabel = new JLabel("Create your new Account");
        titleLabel.setHorizontalAlignment(JLabel.CENTER);
        titleLabel.setFont(new Font("Lucida Blackletter",Font.ITALIC,16));
        layout.setConstraints(titleLabel, new GridBagConstraints(0,0,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,5,0),0,0));
        mainPanel.add(titleLabel);

        newUsernameField = new JTextFieldDeluxe("Username",false);
        layout.setConstraints(newUsernameField, new GridBagConstraints(0,1,2,1,50,0,GridBagConstraints.CENTER,GridBagConstraints.BOTH, new Insets(0,0,8,0),0,0));
        mainPanel.add(newUsernameField);

        newPasswordField = new JTextFieldDeluxe("Password",true);
        layout.setConstraints(newPasswordField, new GridBagConstraints(0,2,2,1,50,0,GridBagConstraints.CENTER,GridBagConstraints.BOTH, new Insets(0,0,8,0),0,0));
        mainPanel.add(newPasswordField);

        newCommentField = new JTextFieldDeluxe("",false);
        layout.setConstraints(newCommentField, new GridBagConstraints(0,3,2,1,50,0,GridBagConstraints.CENTER,GridBagConstraints.BOTH, new Insets(0,0,8,0),0,0));
        mainPanel.add(newCommentField);[/highlight]

Sobald man einmal auswendig kann (bzw. man es sich von Eclipse anzeigen lässt) welcher Parameter für was steht, ist es viel übersichtlicher und sicherer, da alle Daten an einen Punkt sind und das adden der einzelnen Components komplett unnabhängig voneinander ist.


----------



## Ebenius (3. Apr 2009)

Die Herangehensweise hängt sehr vom jeweiligen Problem ab. Ich benutze zum Beispiel auch gern mal eine Constraint-Instanz pro Spalte und habe dann den _y_-Wert auf _GridBagConstraints.RELATIVE_ stehen. Das wird wesentlich übersichtlicher; besonders wenn man eine Zeile irgendwo einfügen muss.

Ebenius


----------

