У меня возникли небольшие проблемы с поведением менеджеров компоновки Java Swing. Я впервые пытаюсь создать собственный графический интерфейс, поэтому, вероятно, я просто пропустил что-то довольно простое, однако я был бы признателен за любые советы, которые можно предложить.
Я пытаюсь создать пользовательскую панель JPanel, которая содержит JLabels и JTextFields, чтобы позволить пользователю вводить IP-адрес (так что четыре JTextFields разделены между собой тремя JLabels, содержащими '.')
Мне очень сложно найти менеджера компоновки, который настроит это так, как я хотел бы; Я пробовал макет Flow и Box, и поскольку ни один из них не работал, я также попробовал GridBag, который, как мне показалось, был излишним, но даже он не работает правильно.
Вот мой код, который запускает класс:
public class PingPanel extends JPanel {
private JLabel[] dotLabels;
private JTextField[] pingFields;
public PingPanel() {
Dimension dim = getPreferredSize();
dim.width = 400;
setPreferredSize(dim);
dotLabels = new JLabel[3];
for (int i = 0; i < dotLabels.length; i++) {
dotLabels[i] = new JLabel(".");
}
pingFields = new JTextField[4];
for (int i = 0; i < pingFields.length; i++) {
pingFields[i] = new JTextField(3);
}
Border panelBorder = BorderFactory.createLineBorder(Color.BLACK);
setBorder(panelBorder);
//setupFlow();
//setupBox();
//setupGridBag();
Я установил ширину панели только на 400, чтобы попытаться отобразить все (как вы вскоре увидите, мне с этим тоже не везет). Я понимаю, что некоторые менеджеры все равно игнорируют предпочтительные размеры, вероятно, поэтому это не работает. Я создал три метода, чтобы попробовать разные менеджеры компоновки; вот они с эффектом, который они производят:
public void setupFlow() {
for (int p = 0; p < pingFields.length; p++) {
if (p == dotLabels.length) {
add(pingFields[p]);
System.out.println(p + " (Final Column)");
}
else {
add(pingFields[p]);
add(dotLabels[p]);
System.out.println(p);
}
}
}
FlowLayout производит это:
Это наиболее близко к тому, как я хочу, чтобы это выглядело, но я не уверен, почему я получаю только одно JTextField и одну метку.
public void setupBox() {
Container pingBox = Box.createHorizontalBox();
for (int p = 0; p < pingFields.length; p++) {
if (p == dotLabels.length) {
pingBox.add(pingFields[p]);
System.out.println(p + " (Final Column)");
}
else {
pingBox.add(pingFields[p]);
pingBox.add(dotLabels[p]);
System.out.println(p);
}
}
}
Это то, что дает мне BoxLayout. Я буквально понятия не имею, как я так сильно все испортил!
public void setupGridBag() {
setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.gridy = 0;
gc.gridx = 0;
gc.weightx = 1.0;
gc.weighty = 1.0;
gc.fill = GridBagConstraints.HORIZONTAL;
add(pingFields[0], gc);
gc.gridx++;
add(dotLabels[0], gc);
gc.gridx++;
add(pingFields[1], gc);
gc.gridx++;
add(dotLabels[1], gc);
gc.gridx++;
add(pingFields[2], gc);
gc.gridx++;
add(dotLabels[2], gc);
gc.gridx++;
add(pingFields[3], gc);
}
GridBagLayout, по крайней мере, дает мне макет, который я ищу, но я не смог понять, как сделать JTextFields шире.
Итак, мы здесь - я уверен, что моя зелень только что заставила меня пропустить что-то очевидное, но я был бы очень признателен, если бы у кого-нибудь были какие-либо идеи.