# Feld breiter, als mit setColumns() angegeben



## Marsman (2. Aug 2007)

Hallo Ihr!

Warum wird ein JTextField breiter angezeigt, als es mit setColumn() angegeben wurde. Ich habe zum Beispiel 10 "Spalten" angegeben. Wenn ich nun in das Feld Text eingebe, scheint es aber eher 15 Zeichen breit zu sein. (Ich habe meinen Code mal angehängt).

Titus


```
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.GridBagConstraints;
import javax.swing.JTextField;

public class ColumnTest extends JFrame {

	private JPanel jContentPane = null;
	private JLabel jLabel = null;
	private JTextField jTextField = null;

	public ColumnTest() {
		super();
		initialize();
	}

	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
			gridBagConstraints1.fill = GridBagConstraints.VERTICAL;
			gridBagConstraints1.gridy = 0;
			gridBagConstraints1.weightx = 1.0;
			gridBagConstraints1.gridx = 1;
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.gridx = 0;
			gridBagConstraints.gridy = 0;
			jLabel = new JLabel();
			jLabel.setText("JLabel");
			jContentPane = new JPanel();
			jContentPane.setLayout(new GridBagLayout());
			jContentPane.add(jLabel, gridBagConstraints);
			jContentPane.add(getJTextField(), gridBagConstraints1);
		}
		return jContentPane;
	}

	private JTextField getJTextField() {
		if (jTextField == null) {
			jTextField = new JTextField();
			jTextField.setColumns(10);
		}
		return jTextField;
	}

	public static void main(String args[]) {
		ColumnTest frame = new ColumnTest();
		frame.setVisible(true);
	}
}
```


----------



## The_S (2. Aug 2007)

Weil die Breite nichts mit der Anzahl der dargestellten Anzahl an Buchstaben zu tun hat!


----------



## SlaterB (2. Aug 2007)

doch doch, das kommt schon hin,
vielleicht nicht bei jeder Schriftgrößen- + Layoutänderung,
aber zumindest am Anfang in dem angegebenen Programm

der Richtbuchstabe ist das m, es passen genau 10 m rein


```
protected int getColumnWidth() {
        if (columnWidth == 0) {
            FontMetrics metrics = getFontMetrics(getFont());
            columnWidth = metrics.charWidth('m');
        }
        return columnWidth;
    }

    /**
     * Returns the preferred size <code>Dimensions</code> needed for this 
     * <code>TextField</code>.  If a non-zero number of columns has been
     * set, the width is set to the columns multiplied by
     * the column width. 
     *
     * @return the dimension of this textfield
     */
    public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        if (columns != 0) {
            Insets insets = getInsets();
            size.width = columns * getColumnWidth() +
                insets.left + insets.right;
        }
        return size;
    }
```


----------



## Marsman (2. Aug 2007)

Achsoooooo.  :wink: 

Ich hatte es bisher immer mit Ziffern ausprobiert. Aber 1234567890 ist im proportionalen Font schmaler als mmmmmmmmmm. Ich wusste nicht, dass das m als Basis angenommen wird.

Dabei fällt mir noch eine andere Frage ein: Macht es überhaupt sinn, setColumns mit GridBagConstraints zu kombinieren? Oder benutzt ihr lieber setPreferedSize()? Manche benutzen sogar Padding oder Weight des Constraints. Mir ist noch nicht klar, wo die Vorteile der 4 Varianten liegen, die Breite einer Komponente festzulegen. Bzw. was benutzt ihr am liebsten?


Titus


----------

