Как добавить дополнительный JButton в JPanel, когда выбран конкретный элемент JComboBox - PullRequest
0 голосов
/ 23 января 2019

Я столкнулся с этой небольшой проблемой, связанной с тем, чтобы сделать мой JCombobox как можно более динамичным.
Например, когда выбран элемент в выпадающем списке, он динамически изменяет количество кнопок в соответствии с количеством дни в месяце и добавляются в панель

Проблема, с которой я сталкиваюсь, заключается в том, что она не меняет автоматически отображение панели, но когда я пыталась увидеть, выполняется ли код в моем журнале консоли. это работает гладко. Я старался изо всех сил, чтобы найти решение, но безрезультатно.

Основная проблема в actionListener, например, если выбран февраль, он отображает 28 кнопок, если выбран январь, он отображает 31 день и т. Д., И т. Д., Но когда я запускаю код, мои состояния system.out.println он работает, но мой графический интерфейс не показывает кнопку.

enter image description here

private static JButton method_Btn(int i){
    JButton btn = new JButton(Integer.toString(i));
    return btn;
}

public static void day(){
    JFrame frame = new JFrame();
    JPanel topPanel = new JPanel();
    JPanel centerPanel = new JPanel();
    JButton days = new JButton();
    JLabel days_label = new JLabel();


    //-- Top Panel
    String month[] = {"--Select Month--" , "January", "February"};
    JComboBox month_combo = new JComboBox(month);
    topPanel.add(month_combo, BorderLayout.PAGE_START);

    //-- Center Panel
    centerPanel.setLayout(new FlowLayout());
    centerPanel.add(days_label);



    //------- Change when jcombo is selected
    month_combo.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            if(month_combo.getSelectedItem().equals("January")){
                for(int i = 0;i < 31;i++){
                    centerPanel.add(method_Btn(i));
                }
            }

            if(month_combo.getSelectedItem().equals("February")){
                for(int i = 0;i < 28;i++){
                    centerPanel.add(method_Btn(i));
                }
            }
        }
    });

    frame.add(topPanel, BorderLayout.PAGE_START);
    frame.add(centerPanel , BorderLayout.CENTER);

    frame.setSize(400,400);
    frame.setVisible(true);
}

public static void main(String[] args){
    day();

}

Дополнительное примечание, Я пришел к выводу, что еще одна проблема, с которой я столкнулся, заключается в том, что она будет складывать количество кнопок, созданных после выбора месяца во второй раз. Как я это решаю, я добавил centerPanel.removeAll (); и centerPanel.repaint ();

month_combo.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            int count = 0;
            //---- gettind days of month selected in comboBox


                if (month_combo.getSelectedItem().equals("February")) {
                    centerPanel.removeAll();
                    centerPanel.repaint();
                    for (int i = 1; i <= 28; i++) {
                        centerPanel.add(method_Btn(i));
                        System.out.println("days in feb " + i);
                    }
                    centerPanel.revalidate();
                }



            if (month_combo.getSelectedItem().equals("March")) {

                centerPanel.removeAll();
                centerPanel.repaint();
                for (int i = 1; i <= 31; i++) {
                    centerPanel.add(method_Btn(i));
                }
                centerPanel.revalidate();

            }
        }
    });

Надеюсь, это поможет любому, кто нуждается. :)

1 Ответ

0 голосов
/ 23 января 2019

Вам нужно revalidate() компонент, который вы добавили, как показано ниже:

centerPanel.revalidate();

Вам необходимо изменить следующий код:

month_combo.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent arg0) {
        if(month_combo.getSelectedItem().equals("January")){
            for(int i = 0;i < 31;i++){
                centerPanel.add(method_Btn(i));
            }
        }

        if(month_combo.getSelectedItem().equals("February")){
            for(int i = 0;i < 28;i++){
                centerPanel.add(method_Btn(i));
            }
        }

        centerPanel.revalidate(); // Need to add this for revalidation for the component
    }
});
...