web-dev-qa-db-fra.com

Comment puis-je contrôler la largeur de JTextFields dans Java Swing?

J'essaie d'avoir plusieurs JTextFields sur une seule ligne, mais je ne veux pas qu'ils aient la même largeur. Comment puis-je contrôler la largeur et rendre certains d'entre eux plus larges que d'autres? Je veux qu'ils occupent ensemble 100% de la largeur totale, donc ce serait bien si je pouvais utiliser une sorte de poids.

J'ai essayé avec .setColumns() mais cela n'a pas de sens.

Voici un exemple, où j'utilise trois lignes avec trois chaînes qui devraient apparaître comme dans les colonnes:

import Java.awt.GridLayout;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class RowTest extends JPanel {

    class Row extends JComponent {
        public Row(String str1, String str2, String str3) {
            this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));

            JTextField fld1 = new JTextField(str1);
            JTextField fld2 = new JTextField(str2);
            JTextField fld3 = new JTextField(str3);

            fld1.setColumns(5); // makes no sense

            this.add(fld1);
            this.add(fld2);
            this.add(fld3);
        }
    }

    public RowTest() {
    this.setLayout(new GridLayout(5,0));

    this.add(new Row("Short", "A long text that takes up more space",
        "Short again"));
    this.add(new Row("Longer but short", "Another long string", "Short"));
    this.add(new Row("Hello", "The long field again",
        "Some info"));
    }

    public static void main(String[] args) {
        new JFrame() {{ this.getContentPane().add(new RowTest());
                            this.pack(); this.setVisible(true); }};
    }

}
18
Jonas

Tous les composants Swing ont une taille préférée. La taille préférée d'un composant texte est basée sur le texte du composant. Donc, généralement, le composant est peint à sa taille préférée.

Je ne vois donc pas le problème avec votre extrait de code. Chaque champ de texte doit avoir une taille préférée différente. De plus, lorsque le cadre est redimensionné, la largeur sera ajustée car BoxLayout essaiera de redimensionner chaque composant jusqu'à sa taille maximale/minimale.

Si vous avez besoin d'aide supplémentaire, publiez votre SSCCE qui illustre réellement le problème de dimensionnement que vous rencontrez.

Éditer:

Sur la base de la dernière exigence, vous pouvez utiliser Disposition relative .

6
camickr
yourTextField = new JTextField("", 20);

si vous le démarrez comme ceci, il définit le champ de texte comme étant vide et avec 20 colonnes

36
Michael Pankhurst

Essaye ça:

textfield.setPreferredSize(new Dimension(int width, int height));
7
Psychosis404
// 1. create JTextField
yourTextField = new JTextField();
// 2. store default height
int defaultHeight = yourTextField.getSize().getHeight();
// 3. set custom width and default height
yourTextField.setSize(new Dimension(yourWidth, defaultHeight));
0
Xorty