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

je veux faire un formulaire d'entrée en Java pour que l'utilisateur puisse entrer des détails.

quelque Chose comme ceci:

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");
    }
}
}

Ma sortie de la forme:

current state of form

je pense que je dois changer ma mise en page à quelque chose comme BorderLayout. Comment obtenir l'apparence du formulaire en haut de la question?

15
demandé sur Matthias Braun 2010-07-05 19:07:46

4 réponses

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

texte alternatif http://java.sun.com/docs/books/tutorial/figures/uiswing/layout/SpringForm.png

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 cette forme simple, mais il y a des bibliothèques tierces qui ont plus de fonctionnalités. I. e. MiG Mise En Page.

15
répondu Jonas 2010-07-05 15:19:35

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 helper 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);
}
6
répondu Matthias Braun 2017-12-08 16:13:07

vous utilisez actuellement un GridLayout, qui peut être très bien pour votre besoin.

Toutefois, vous devez l'initialiser avec le nombre réel de lignes et de colonnes que 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 input. Voir le tutorial Java pour plus d'information sur GridLayouts.

texte alternatif http://java.sun.com/docs/books/tutorial/figures/uiswing/layout/GridLayoutDemo.png

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

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

2
répondu Gnoupi 2010-07-05 15:17:42

Vous pouvez le faire avec DesignGridLayout. L'extrait de code suivant devrait fonctionner (désolé, je ne pouvais pas le tester, je ne suis pas sur mon dev de la station en ce moment):

DesignGridLayout layout = new DesignGridLayout(panel);
layout.row().grid(streetAddressLabel).add(streetAddressField);
layout.row().grid(cityLabel).add(cityField);
layout.row().grid(stateLabel).add(stateSpinner);
layout.row().grid(zipLabel).add(zipField);
layout.emptyRow();
layout.row().right().add(setAddressButton, clearAddressButton);

alors vous utiliserez JDialog plutôt que JOptionPane) pour afficher votre panel.

0
répondu jfpoilpret 2010-07-06 06:19:46