Добавление новых выпадающих списков Java - PullRequest
0 голосов
/ 02 июля 2018

У меня проблема с интерфейсом Swing на Java. Объяснение: У меня есть Combobox с 1, 2, 3, 4, 5 предметами. Когда точный элемент выбран, мне нужно создать еще несколько выпадающих списков, количество которых зависит от выбранного элемента. Таким образом, если выбрано число 5, в рамке должно появиться еще 5 комбинированных списков. Я использовал ActionListener, но он не работал должным образом. Тем не менее, тот же код, но за пределами Actionlistener работает хорошо. Что за проблема?

public class FrameClass extends JFrame {
    JPanel panel;
    JComboBox box;

    String[] s = {"1", "2", "3", "4", "5"};
    String[] s1 = {"0", "1", "2", "3", "4", "5"};
    public FrameClass() {
        panel = new JPanel();
        box = new JComboBox(s);
        JComboBox adults = new JComboBox(s);
        JComboBox children = new JComboBox(s1);

        panel.add(box, BorderLayout.CENTER);

        box.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
            for(int i = 0; i <= box.getSelectedIndex(); i++) {
                panel.add(adults, BorderLayout.WEST);
                panel.add(children, BorderLayout.WEST);
            }
        }
        });
        add(panel);
    }
}

public class MainClass {
    public static void main(String[] args) {
        JFrame frame = new FrameClass();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setExtendedState(Frame.MAXIMIZED_BOTH);
        frame.getContentPane().setBackground(Color.WHITE);
        frame.setVisible(true);
    }
}

1 Ответ

0 голосов
/ 02 июля 2018

Проблема в том, что вы не сообщаете менеджеру макета о новых элементах на вашей панели.

Вот правильный вариант слушателя ваших действий:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class FrameClass extends JFrame {
    JPanel panel;

    JComboBox<String> box;

    String[] s = {"1", "2", "3", "4", "5"};

    String[] s1 = {"0", "1", "2", "3", "4", "5"};

    public FrameClass() {
        panel = new JPanel();
        box = new JComboBox(s);
        JComboBox[] adults = new JComboBox[5];
        JComboBox[] children = new JComboBox[5];
        for (int i = 0; i < 5; i++) {
            adults[i] = new JComboBox<>(s);
            children[i] = new JComboBox<>(s1);
        }

        panel.add(box, BorderLayout.CENTER);
        JPanel nested = new JPanel();
        add(nested, BorderLayout.EAST);
        box.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nested.removeAll();
                nested.setLayout(new GridLayout(box.getSelectedIndex() + 1, 2));
                for (int i = 0; i <= box.getSelectedIndex(); i++) {
                    nested.add(adults[i]);
                    nested.add(children[i]);
                }
                getContentPane().revalidate();
                getContentPane().repaint();
                pack();
            }
        });
        add(panel);
    }

    public static void main(String[] args) {
        JFrame frame = new FrameClass();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.getContentPane().setBackground(Color.WHITE);
        frame.setLocationRelativeTo(null); // center the window
        frame.setVisible(true);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...