Как создать форму ввода в Java-коде (не Netbeans с использованием JForm)?
Я хочу создать форму ввода на Java, чтобы пользователь мог ввести данные.
Что-то вроде этого:
![желаемая форма]()
Мой код
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");
}
}
}
Моя форма вывода:
![текущее состояние формы]()
Думаю, я должен изменить свой макет на что-то вроде BorderLayout
. Любые идеи, как получить вид формы в верхней части вопроса?
Ответы
Ответ 1
Да, вам нужно изменить макет. Посмотрите SpringLayout и этот пример:
alt text 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 отлично работает для этой простой формы, но есть сторонние библиотеки, которые имеют больше возможностей. То есть МиГ-макет.
Ответ 2
Другой способ создать форму с помощью GridBagLayout, получив следующий результат:
![enter image description here]()
код:
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);
Вспомогательный метод 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);
}
Ответ 3
В настоящее время вы используете GridLayout, что может быть хорошо для ваших нужд.
Однако вы должны инициализировать его фактическим количеством строк и столбцов, которые вам понадобятся. В вашем случае:
new GridLayout(0, 2);
0 для строк означает, что нет предела, и у вас есть 2 столбца, один для ярлыков и один для входного компонента. Дополнительную информацию о GridLayouts см. В учебнике по Java.
alt text http://java.sun.com/docs/books/tutorial/figures/uiswing/layout/GridLayoutDemo.png
Обратите внимание, однако, что GridLayout сделает все "ячейки" одинаковыми по размеру, что может быть проблемой для ярлыков.
Однако Джонас прав, SpringLayout, вероятно, более приспособлен к вашим потребностям.
Ответ 4
Вы можете сделать это с помощью DesignGridLayout. Следующий фрагмент должен работать (извините, я не смог его протестировать, я не нахожусь на моей станции dev прямо сейчас):
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);
Затем вы должны использовать JDialog
(а не JOptionPane
) для отображения panel
.