Pregunta

Quiero hacer un formulario de entrada en Java para que el usuario pueda ingresar detalles.

Algo como esto:

desired form


Mi código

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

Mi formulario de salida:

current state of form

Creo que debo cambiar mi diseño a algo como BorderLayout. ¿Alguna idea de cómo obtener el aspecto del formulario en la parte superior de la pregunta?

¿Fue útil?

Solución

Sí, tienes que cambiar el diseño. Mira esto Singlaut y este ejemplo:

alt text
(fuente: 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 funciona bien para esta forma simple, pero hay bibliotecas de terceros que tienen más características. Es decir Diseño de MIG.

Otros consejos

Otra forma de crear un formulario usando GridbagLayout, produciendo el siguiente resultado:

enter image description here

Código:

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

El método auxiliar 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);
}

Actualmente está utilizando un GridLayout, que puede estar bien para su necesidad.

Sin embargo, debe inicializarlo con el número real de filas y columnas que necesitará. En tu caso:

new GridLayout(0, 2); 

0 para filas significa que no hay límite, y usted tiene 2 columnas, una para las etiquetas y otra para el componente de entrada. Ver el Tutorial de Java Para más información sobre GridLayouts.

alt text
(fuente: Sun.com)

Sin embargo, tenga en cuenta que el GridLayout hará que todas las "celdas" sean del mismo tamaño, lo que puede ser un problema para las etiquetas.

Sin embargo, Jonas tiene razón, un Singlaut Probablemente esté más adaptado a su necesidad.

Puedes hacer esto con DesignGridLayout. El siguiente fragmento debería funcionar (lo siento, no podría probarlo, no estoy en mi estación de desarrollo en este momento):

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

Entonces usarías JDialog (más bien que JOptionPane) para mostrar tu panel.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top