Динамическое добавление JButton в JPanel на основе значений JList

1

Я работаю над приложением Java Swing. Мои требования: -

В моем JFrame у меня есть JList со значениями "Один", "Два", "Три" и т.д. Когда я выбираю один элемент списка, я хочу показать "n", где "n" - это выбранное значение.

Пример: - Если я выбираю "Три" из списка, в JFrame должно быть 3 кнопки.

Ниже мой код: -

public class Details extends JFrame {

    String[] navData = new String{"One","Two","Three","Four"};
    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Details frame = new Details();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */

    public Details()  {

        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        Toolkit tk = Toolkit.getDefaultToolkit();
         int xSize = ((int) tk.getScreenSize().getWidth());
         int ySize = ((int) tk.getScreenSize().getHeight());
         //frame.setSize(xSize,ySize);
        setTitle("Test");
        setBounds(0, 0, 776, 457);
        setResizable(false);
        //setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        final JList list = new JList(navData);
        list.setBounds(0, 0, 140, ySize);
        contentPane.add(list);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setFixedCellHeight(50);
        list.setFixedCellWidth(70);
        list.setBorder(new EmptyBorder(10,10, 10, 10));


        list.addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent arg0) {

                int numButtons;
                String selectedItem = navData[list.getSelectedIndex()];
                switch (selectedItem) {
                case "One":
                    addButtons(1);
                    break;
                case "Two":
                    addButtons(2);
                    break;
                case "Three":
                    addButtons(3);
                    break;
                case "Four":
                    addButtons(4);
                    break;
                default:
                    break;
                }

            }
        });
        list.setSelectedIndex(0);


    }

    public void addButtons(int n)
    {
        revalidate();
        for(int i = 0; i<n;i++)
        {
            JButton button = new JButton(" "+navData[i]);
            button.setBounds(200 + (i*50), 150, 50, 50);
            contentPane.add(button);    
        }

    }
}

- Проблема: -

Когда я изменяю выбранный элемент в списке, JPanel не обновляется. Другими словами, я не получаю 3 кнопки, когда я выбираю "Три" из списка. Я получаю только 1 кнопку, которая была создана по умолчанию.

  • 0
    Попробуйте вызвать contentPane.relavidate() и contentPane.repaint() после цикла.
  • 0
    сделал это ... но не помогает .. я попытался вызвать 2 подряд сразу после окончания цикла for .. не повезло
Теги:
swing
jpanel
jbutton

3 ответа

0
Лучший ответ

Я внес эти изменения:

  1. Я поместил JList в JPanel и JButtons в другой JPanel.

  2. Я использовал FlowLayout для JList JPanel и FlowLayout для JButtons JPanel. Вы можете изменить эти макеты Swing, если хотите.

  3. Я изменил значение по умолчанию на 4 кнопки, поэтому JFrame будет правильно упаковываться до 4 JButtons.

  4. Я добавил метод удаления JButtons из JPanel, прежде чем пытаться добавить JButtons в JPanel.

  5. Я пересмотрел и перекрасил JButton JPanel.

Здесь код:

package com.ggl.testing;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class Details extends JFrame {

    private static final long serialVersionUID = -555805219508469709L;

    private String[] navData = { "One", "Two", "Three", "Four" };

    private JPanel buttonPanel;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Details frame = new Details();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */

    public Details() {
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setTitle("Test");

        buttonPanel = new JPanel();

        JPanel listPanel = new JPanel();
        final JList<String> list = new JList<String>(navData);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setFixedCellHeight(50);
        list.setFixedCellWidth(70);
        list.setBorder(new EmptyBorder(10, 10, 10, 10));

        list.addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent event) {

                String selectedItem = navData[list.getSelectedIndex()];
                switch (selectedItem) {
                case "One":
                    removeButtons(buttonPanel);
                    addButtons(buttonPanel, 1);
                    break;
                case "Two":
                    removeButtons(buttonPanel);
                    addButtons(buttonPanel, 2);
                    break;
                case "Three":
                    removeButtons(buttonPanel);
                    addButtons(buttonPanel, 3);
                    break;
                case "Four":
                    removeButtons(buttonPanel);
                    addButtons(buttonPanel, 4);
                    break;
                default:
                    break;
                }

            }
        });
        list.setSelectedIndex(3);

        listPanel.add(list);

        add(listPanel, BorderLayout.WEST);
        add(buttonPanel, BorderLayout.CENTER);

        pack();
    }

    public void removeButtons(JPanel panel) {
        Component[] components = panel.getComponents();
        for (int i = 0; i < components.length; i++) {
            panel.remove(components[i]);
        }
    }

    public void addButtons(JPanel panel, int n) {
        for (int i = 0; i < n; i++) {
            JButton button = new JButton(navData[i]);
            panel.add(button);
        }
        panel.revalidate();
        panel.repaint();
    }
}
  • 0
    Огромное спасибо ...
0

Вы можете создать панель "обертка" для кнопок, т.е.

...
private JPanel buttonsWrapper;
...
// in the constructor
buttonsWrapper = new JPanel();
buttonsWrapper.setLayout(null);
buttonsWrapper.setBounds(200, 150, 200, 50);
buttonsWrapper.add(wrapperPanel);

и добавьте кнопки на эту панель

public void addButtons(int n) {
    buttonsWrapper.removeAll();
    for(int i = 0; i < n; i++) {
        JButton button = new JButton(" " + navData[i]);
        button.setBounds((i*50), 0, 50, 50);
        buttonsWrapper.add(button);    
    }
    buttonsWrapper.revalidate();
    buttonsWrapper.repaint();
}
0

Заменить contentPane.setLayout(null); с каким-то макетом, таким как contentPane.setLayout(new GridBagLayout());

Добавить

contentPane.removeAll() как первая строка в addButtons().

  • 0
    contentPane.setLayout(new GridBagLayout()) переместил мой JList и JButtons в центр экрана ... Я хочу, чтобы мой JList отображался в крайнем левом углу кадра, а JButton отображался справа от JList и выравнивался по горизонтали относительно других кнопки .... также contentPane.removeAll() удаляет JList ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню