将未知数量的JButton添加到JScrollPane

时间:2015-02-01 14:45:13

标签: java swing jbutton jscrollpane

我(几乎)在任何地方(herehere专门查看)找到我的问题的答案。我正在尝试向JButton添加未知数量的JScrollPane,具体取决于JComboBox的选择。我所知道的是你必须将元素添加到JPanel才能将它们放入GUI中。

这是一个示例代码: (它不起作用),这是一个例子)

public class test {

ArrayList<JButton> button = new ArrayList<JButton>();
String[] stringArray = {"Goat", "Cow", "Dog", "Cat", "Human"};
JComboBox comboBox = new JComboBox(stringArray);
JPanel containerPanel = new JPanel();
JScrollPane scroller = new JScrollPane(containerPanel);

public void addButton(String btnName) {
    button.add(new JButton(btnName));
    containerPanel.add(button.get(button.size() - 1));
}

public class Action implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        addButton(comboBox.getSelectedItem().toString());
    }
}

}

我想添加与用户想要的JButton一样多的containerPanel.add(new JButton("test"));

如果我只是这样添加它们:

public class Frame extends JFrame {

String[] list = {"Human", "Goat", "Dog", "Cat", "Duck"};
ArrayList<JButton> button = new ArrayList<JButton>();
JComboBox cBox = new JComboBox(list);
JPanel container = new JPanel();
JScrollPane scroller = new JScrollPane(container);

public Frame() {
    cBox.addActionListener(new Action());
    this.setLayout(new BorderLayout());
    this.setSize(200, 200);
    this.add(cBox, BorderLayout.SOUTH);
    this.add(scroller, BorderLayout.CENTER);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);      
}

public void createBtn(String s) {
    System.out.println("Button's label : " + s);
    button.add(new JButton(s));
    System.out.println("Button's index : " + (button.size() - 1));
    container.add(button.get(button.size() - 1));
}

public class Action implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Action made");
        JComboBox temp = (JComboBox) e.getSource();
        createBtn(temp.getSelectedItem().toString());
    }
}
}

它有效,但这不是我想要实现的目标。

你能帮助我吗?

修改: ___________________________________________________________________________

这是一些编译的代码,是我正在尝试做的简化副本:

{{1}}

1 个答案:

答案 0 :(得分:1)

所以我刚刚发了一个非常简洁的功能来刷新JPanelvalidate()。它几乎隐藏在StackOverflow here中。

在阅读了validate()revalidate()invalidate()(这没有用)here之间的区别之后,我认为validate()就是那个我需要。

只需在createBtn(String s)中添加此功能,即可显示所有JButton

新代码如下所示:

public class Frame extends JFrame {

    String[] list = {"Human", "Goat", "Dog", "Cat", "Duck"};
    ArrayList<JButton> button = new ArrayList<JButton>();
    JComboBox cBox = new JComboBox(list);
    JPanel container = new JPanel();
    JScrollPane scroller = new JScrollPane(container);

    public Frame() {
        cBox.addActionListener(new Action());
        this.setLayout(new BorderLayout());
        this.setSize(200, 200);
        this.add(cBox, BorderLayout.SOUTH);
        this.add(scroller, BorderLayout.CENTER);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);      
    }

    public void createBtn(String s) {
        System.out.println("Button's label : " + s);
        button.add(new JButton(s));
        System.out.println("Button's index : " + (button.size() - 1));
        container.add(button.get(button.size() - 1));

        //Note the new addition
        container.validate();
    }

    public class Action implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Action made");
            JComboBox temp = (JComboBox) e.getSource();
            createBtn(temp.getSelectedItem().toString());
        }
    }
}

根据我的理解,validate()向所有孩子询问他们的大小和类似的东西,并确认他们可以继续。唯一的问题是它是否耗时。换句话说,它可能会导致性能问题。

如果你有更好的答案,请纠正我。