TextArea Größe festlegen

Status
Nicht offen für weitere Antworten.

Zaphi67

Mitglied
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]
 
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!
 
nicht drauf hören,
bei Layouts heißt das
terms.setPreferredSize(new Dimension(450, 200));
 
Hör bloß nicht auf diesen Unsinn. Verwende einen vernünftigen Layoutmanager und versuche nicht, absolute Pixelgrößen festzulegen.
 
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 🙂
 
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...
 
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 😉
 
naja, vielleicht schreibe ich mal mein eigenes Layout, wenn es nicht zu viel Arbeit seien sollte,
ich trau mir das aber noch nicht zu
 
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:
 
Ä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.:
Code:
....

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:

Code:
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 ^^
 
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 😉
 
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 ;-)
 
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.
 
> 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 😉
 
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 🙂
 
> 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 😉

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.
 
Ein bisschen off topic: Woher kommen diese Punkte "get.Position", "set.Position"? Sieht sonderbar aus.

Ebenius
 
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();
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);

....
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.
 
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
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben