web-dev-qa-db-fra.com

Comment créer un formulaire d'entrée en Java (pas Netbeans utilisant JForm)?

Je veux créer un formulaire de saisie en Java afin que l'utilisateur puisse entrer des détails.

Quelque chose comme ça:

desired form


Mon code

import Java.awt.GridLayout;
import javax.swing.*;

class JOptionPaneTest {

public static void main(String[] args) {
    String[] items = {"One", "Two", "Three", "Four", "Five"};
    JComboBox combo = new JComboBox(items);
    JTextField field1 = new JTextField("1234.56");
    JTextField field2 = new JTextField("9876.54");
    JPanel panel = new JPanel(new GridLayout(0, 1));
    panel.add(combo);
    panel.add(new JLabel("Field 1:"));
    panel.add(field1);
    panel.add(new JLabel("Field 2:"));
    panel.add(field2);
   int result = JOptionPane.showConfirmDialog(null, panel, "Test",
        JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
    if (result == JOptionPane.OK_OPTION) {
        System.out.println(combo.getSelectedItem()
            + " " + field1.getText()
            + " " + field2.getText());
    } else {
        System.out.println("Cancelled");
    }
}
}

Mon formulaire de sortie:

current state of form

Je pense que je dois changer ma disposition en quelque chose comme BorderLayout. Avez-vous des idées pour obtenir l'apparence du formulaire en haut de la question?

16
Haxed

Oui, vous devez changer la disposition. Jetez un oeil à SpringLayout et cet exemple:

alt text
(source: Sun.com )

String[] labels = {"Name: ", "Fax: ", "Email: ", "Address: "};
int numPairs = labels.length;

//Create and populate the panel.
JPanel p = new JPanel(new SpringLayout());
for (int i = 0; i < numPairs; i++) {
    JLabel l = new JLabel(labels[i], JLabel.TRAILING);
    p.add(l);
    JTextField textField = new JTextField(10);
    l.setLabelFor(textField);
    p.add(textField);
}

//Lay out the panel.
SpringUtilities.makeCompactGrid(p,
                                numPairs, 2, //rows, cols
                                6, 6,        //initX, initY
                                6, 6);       //xPad, yPad

SpringLayout fonctionne bien pour ce formulaire simple, mais il existe des bibliothèques tierces qui ont plus de fonctionnalités. C'est à dire. Disposition MiG .

15
Jonas

Une autre façon de créer un formulaire en utilisant GridBagLayout , produisant le résultat suivant:

enter image description here

Code:

JPanel addressPanel = new JPanel();
Border border = addressPanel.getBorder();
Border margin = new EmptyBorder(10, 10, 10, 10);
addressPanel.setBorder(new CompoundBorder(border, margin));

GridBagLayout panelGridBagLayout = new GridBagLayout();
panelGridBagLayout.columnWidths = new int[] { 86, 86, 0 };
panelGridBagLayout.rowHeights = new int[] { 20, 20, 20, 20, 20, 0 };
panelGridBagLayout.columnWeights = new double[] { 0.0, 1.0, Double.MIN_VALUE };
panelGridBagLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0,
                                               Double.MIN_VALUE };
addressPanel.setLayout(panelGridBagLayout);

addLabelAndTextField("City:", 0, addressPanel);
addLabelAndTextField("Street:", 1, addressPanel);
addLabelAndTextField("State:", 2, addressPanel);
addLabelAndTextField("Phone:", 3, addressPanel);
addLabelAndTextField("Mail:", 4, addressPanel);

La méthode d'assistance addLabelAndTextField:

private void addLabelAndTextField(String labelText, int yPos,
                                  Container containingPanel) {

    JLabel label = new JLabel(labelText);
    GridBagConstraints gridBagConstraintForLabel = new GridBagConstraints();
    gridBagConstraintForLabel.fill = GridBagConstraints.BOTH;
    gridBagConstraintForLabel.insets = new Insets(0, 0, 5, 5);
    gridBagConstraintForLabel.gridx = 0;
    gridBagConstraintForLabel.gridy = yPos;
    containingPanel.add(label, gridBagConstraintForLabel);

    JTextField textField = new JTextField();
    GridBagConstraints gridBagConstraintForTextField = new GridBagConstraints();
    gridBagConstraintForTextField.fill = GridBagConstraints.BOTH;
    gridBagConstraintForTextField.insets = new Insets(0, 0, 5, 0);
    gridBagConstraintForTextField.gridx = 1;
    gridBagConstraintForTextField.gridy = yPos;
    containingPanel.add(textField, gridBagConstraintForTextField);
    textField.setColumns(10);
}
9
Matthias Braun

Vous utilisez actuellement un GridLayout, ce qui peut convenir à votre besoin.

Cependant, vous devez l'initialiser avec le nombre réel de lignes et de colonnes dont vous aurez besoin. Dans ton cas:

new GridLayout(0, 2); 

0 pour les lignes signifie qu'il n'y a pas de limite et vous avez 2 colonnes, une pour les étiquettes et une pour le composant d'entrée. Voir le tutoriel Java pour plus d'informations sur GridLayouts.

alt text
(source: Sun.com )

Notez cependant que le GridLayout fera que toutes les "cellules" auront la même taille, ce qui peut être un problème pour les étiquettes.

Cependant, Jonas a raison, un SpringLayout est probablement plus adapté à votre besoin.

2
Gnoupi