getpreferredsize() zu klein?

selmaohneh

Mitglied
Moin!

Ich habe ein Textfield, das ich mit setsize(getprefferedsize()) optimal anpassen möchte. Leider wird die Textbox dann etwas zu klein, der erste Buchstabe ist nicht sichtbar. Was mache ich falsch?

Hier mein Code:

Java:
import java.awt.BorderLayout;

public class BasisÄndern extends JFrame {

	private JPanel contentPane;
	private JTextField txtCent;

	public BasisÄndern(final Spieler cello,final Spieler whisky,final Spieler joost, final Kasse kasse) {
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent arg0) {
				dispose();
				Hauptseite frame = new Hauptseite(cello, whisky, joost, kasse);
				frame.setVisible(true);
			}
		});
		setResizable(false);
		setTitle("Kassenbasis \u00E4ndern");
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		GridBagLayout gbl_contentPane = new GridBagLayout();
		gbl_contentPane.columnWidths = new int[]{0, 0};
		gbl_contentPane.rowHeights = new int[]{0, 0, 0};
		gbl_contentPane.columnWeights = new double[]{0.0, Double.MIN_VALUE};
		gbl_contentPane.rowWeights = new double[]{0.0, 0.0, Double.MIN_VALUE};
		contentPane.setLayout(gbl_contentPane);
		
		txtCent = new JTextField();
		txtCent.addFocusListener(new FocusAdapter() {
			@Override
			public void focusGained(FocusEvent arg0) {
				txtCent.selectAll();
			}
		});
		txtCent.setHorizontalAlignment(SwingConstants.CENTER);
		txtCent.setText("Kassenbasis in Cent");
		txtCent.setSize(txtCent.getPreferredSize());
		GridBagConstraints gbc_txtCent = new GridBagConstraints();
		gbc_txtCent.insets = new Insets(0, 0, 5, 0);
		gbc_txtCent.gridx = 0;
		gbc_txtCent.gridy = 0;
		contentPane.add(txtCent, gbc_txtCent);
		txtCent.setColumns(10);
		
		JButton btnEintragen = new JButton("Eintragen");
		btnEintragen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String dateiname = "./Daten/Kasse_Basis.txt";
				File datei = new File(dateiname);
				if (!datei.exists()) {
					try {
						datei.createNewFile();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
				Writer schreiber;
				try {
					schreiber = new FileWriter(datei, false);
					schreiber.write(txtCent.getText());
					schreiber.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				dispose();
				Hauptseite frame = new Hauptseite(cello, whisky, joost, kasse);
				frame.setVisible(true);
			}
		});
		GridBagConstraints gbc_btnEintragen = new GridBagConstraints();
		gbc_btnEintragen.gridx = 0;
		gbc_btnEintragen.gridy = 1;
		contentPane.add(btnEintragen, gbc_btnEintragen);
		
		pack();
		setFocusTraversalPolicy(new FocusTraversalOnArray(new Component[]{txtCent, btnEintragen}));
	}

}
 

selmaohneh

Mitglied
Das verstehe ich noch nicht ganz. Ich sehe das bisher so:

getprefferedsize() gibt mir die optimale Größe des textfields zurück.
setsize() ändern die Größe des textfields.

Wenn ich also die Größe mit setsize() auf die optimale Größe getpreferredsize() ändern möchte, mach ich doch setsize(getpreferredsize())?

Wo ist mein Denkfehler und wie kriege ich das gewünschte Ergebnis?

Vielen, vielen Dank!
 

kaoZ

Top Contributor
Du musst die Bevorzugte Größe (preferredSize) auch setzen ^^

Code:
 txtCent.setSize(txtCent.getPreferredSize());
Das bringt rein garnichts

da du hier versuchst txtCent eine Größe zuweisen möchtest die du zuvor nicht festgelegt hast.

richtig wäre

Java:
txtCent.setPreferredSize(new Dimension(x, y));

wobei x und y stellvertrettend für deine Werte sind.

du kannst ja ein Element dessen Bevorzugte Größe du nicht setzt, nicht nach seiner bevorzugten Größe Fragen

Code:
setPreferredSize()
benötigst du z.b auch überall dort, wo du Layoutmanager verwendest, welche die Breite und oder Höhe, automatisch an die noch verfügbarer breite und oder höhe festlegen.
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
die Frage ist , was genau du vorhast.

du könntest entweder, die Zeichen begrenzen, oder du designst dein Textfeld eben länger als du es benötigst.

ein mit der Textlänge variables Textfeld gibt es so nicht, du könntest sonst eine JTextArea nutzen.

[EDIT]
BTW. warum arbeitest du mit mehreren
Code:
GridBagConstraints
? du kannst auch einfach eine Instanz erzeugen und diese für die jeweiligen Elemente überschreiben
[/EDIT]
 
Zuletzt bearbeitet:

selmaohneh

Mitglied
Ich verwende GridbagLayout und habe in diesem Fall lediglich ein Textfield und einen Button untereinander. Anhand des Textes im Filed und des Textes im Button sollen die idealen Größen angepasst werden. Also möglichst klein, aber groß genug, das noch alles gelesen werden kann. Ich habe ein pack() am Ende, aber dadurch kann man einen Buchstaben in dem Field nicht lesen.

Wie ist denn da die allgemein Herangehensweise?
 

kaoZ

Top Contributor
Durch das Pack wird der Frame ja immer nur genau so groß wie die Bevorzugte Göße seiner Elemente in ihm.


wenn du also deine contentPane auf eine preferredSize von z.B 300, 150 setzt, umschließt dein Frame dieses Panel dementsprechend. wenn du jetzt deinem Textfeld eine PreferredSize zuweist musst du darauf achten diese dementsprechend groß genug zu wählen.

erläutere mal bitte was genau du mit "idealer größe" meinst.
 
Zuletzt bearbeitet:

selmaohneh

Mitglied
Wenn ich in einem Textfield den Text "Hallo ich bin ein Test" habe, dann ergibt sich durch die Textgröße und die Anzahl der Buchstaben doch eine Mindestbreite, die ich dem Textfield als Minimumbreite vorgeben kann. Ich möchte diese Größe nicht durch Probieren herausfinden und dann als preferedsize setzen, sondern eben die preferedsize automatisch durch den Inhalt bestimmen...
 

kaoZ

Top Contributor
Ok nochmal von vorne, das was du vorhast funktioniert nicht ohne weiteres,

Fall 1:

Nehmen wir mal an du hast folgende Situation:

Java:
import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;


public class Foo extends JFrame {
	private static final long serialVersionUID = 1L;
	
	JTextField txt;
	JButton btn;
	
	{
		txt = new JTextField();
		txt.setColumns(10);
		
		btn = new JButton("Klick mich");
	}
	
	public Foo() {
		add(BorderLayout.PAGE_START, txt);
		add(BorderLayout.PAGE_END, btn);
		setVisible(true);
		pack();
	}
	
	public static void main(String[] args) {
		new Foo();
	}
}

ist das hier das Ergebnis:



So würde es mit gesetzter Bevorzugter Größe aussehen.



Wie du sehen kannst setze ich hier nur den bevorzugte Größe für das Textfeld, und der Layoutmanager streckt die Breite des Buttons automatisch auf die noch verfügbare breite.

Was du machen könntest :

1. Einen Counter erstellen der die Anzahl der Maximalen Buchstaben im Textfeld limitiert, und dein Textfeld dementsprechend vorab auf eine bevorzugte Größe setzt so das alle Buchstaben hineinpassen.

2. Das TextFeld über paintComponent(Graphics g); jeweils neu Zeichnen lassen ( halte ich für eine sehr Schlechte alternative).

Zumal , sollte sich dein TextFeld dynamisch an die in , sich in ihm befindende Größe anpassen, ( ohne Scrollbar) zerschiesst du dir sämtliche Layouts.
 
Zuletzt bearbeitet:

selmaohneh

Mitglied
Okay, danke für die ausführliche Antwort. Ich habe jetzt über Ausprobieren innerhalb von setcolumns() eine passende Größe gefunden. Habe jetzt ohne jegliches preferedsize gearbeitet und nun sieht es soweit gut aus.

Wenn ich über setcolumns eine Breite setze, ergibt fill doch überhaupt keinen Sinn mehr, oder?

Danke!
 

selmaohneh

Mitglied
Der Text in meinem Textfield ändert seine Länge nicht. Deshalb reicht es mir jetzt, die Breite mit setcolumns() zu setzen.
Im Gridbaglayout kann ich zusätzlich beim Button fill aktivieren, damit er automatisch den gesamten Platz in seiner Zelle einnimmt, die durch die Breite des Textfields vorbestimmt ist.
Einzige Frage wäre nur, was passiert, wenn ich zusätzlich beim Button setcolumns() setze. Überwiegt setcolumns oder fill...

Problem ist für mich gelöst. Vielen Dank! Sorry, wenn ich das PRoblem nicht so gut Erklären konnte, bin relativ neu in Java und kann die Fachbegriffe noch nicht so gut.^^
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben