¿Cómo hacer un formulario de entrada en el código Java (no NetBeans usando JForm)?
-
02-10-2019 - |
Pregunta
Quiero hacer un formulario de entrada en Java para que el usuario pueda ingresar detalles.
Algo como esto:
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:
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?
Solución
Sí, tienes que cambiar el diseño. Mira esto Singlaut y este ejemplo:
(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:
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.
(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
.