使用HashMap使用JRadioButtons填充JPanel

时间:2015-04-06 16:59:50

标签: java swing hashmap

我一直试图弄清楚如何制作一个基于数组内容动态创建的弹出窗口,我几乎可以肯定我错过了一些重要的东西,可以帮助我解决并完全理解这个问题。

我到底想做什么?

我有一个程序循环访问某个目录,收集所有文件夹名称并将其存储在ArrayList中。当我尝试使用ArrayList动态创建窗口时出现问题。我不确定如何解决这个问题。

我目前的流程是什么

我有3节课。视图,模型和控制类。包含文件夹的数组存储在模型类中。我通过控件类检索它。我在ActionListener内创建了一个新的JPanel以及HashMap。我遍历HashMap 添加String名称和JRadioButton,我尝试填充窗口,但我真的不知道如何。

这是我正在使用的代码片段:

public void actionPerformed(ActionEvent e) {

        if (e.getSource() == theView.viewButton) {

            System.out.println("View Button clicked");
            theView.setBotTextArea("");
            theView.setBotTextArea("Viewing...");

            JPanel radioPanel = new JPanel();

            // Method that gather folder names and stores it in an array
            theModel.listAllFolders(); 
            // Make the categories array and store the names
            ArrayList<String> categories = theModel.getListOfCategories();

            // Create a hashmap with names and JRadioButtons
            HashMap<String, JRadioButton> buttonMap = new HashMap<String, JRadioButton>();

            // loop to fill up the HashMap
            for (int i = 0; i < categories.size(); i++ ) { 

                buttonMap.put(categories.get(i), new JRadioButton(categories.get(i)));

            }

            for (Entry<String, JRadioButton> entry : buttonMap.entrySet()) { 

                // Not sure how to retrieve the hashmap data to create and
                   fill up the window

            }
}

我对HashMaps非常陌生(我正在努力学习它)所以我甚至不确定这是不是一个好主意。我已经坚持了这项任务将近3天。在过去,我试图使用数组来完成类似的任务,但我几乎可以肯定,这是我的一个巨大的逻辑错误,阻止我完成它。

我很欣赏对此事的任何新见解。

2 个答案:

答案 0 :(得分:2)

ArrayList<String> categories = theModel.getListOfCategories();
for (String val : categories) {
  JRadioButton jb = new JRadioButton(val);
  radioPanel.add(jb);
}
//now you need to add the radioPanel JPanel to an existing Container, or call setContentPane(radioPanel);

答案 1 :(得分:2)

如果JRadioButton中显示的文本与放入HashMap的文本相同,我认为不需要HashMap。只需确保使用正确的文本设置JRadioButton的actionCommand String,将所有JRadioButtons添加到同一个ButtonGroup,并在需要选择时,从ButtonGroup的getSelection()方法返回的ButtonModel中获取actionCommand。

e.g。

for (String text : fileList) {
   JRadioButton btn = new JRadioButton(text);
   btn.setActionCommand(text); // radiobuttons don't do this by default
   buttonGroup.add(btn);  // ButtonGroup to allow single selection only
   myRadioPanel.add(btn); // JPanel usually uses a GridLayout
}
// if myRadioPanel is already in the GUI, then revalidate and repaint it

稍后获得选择(如果通过另一个按钮的ActionListener完成:

ButtonModel model = buttonGroup.getSelection();
if (model != null) {
   selectedText = model.getActionCommand();
}

或者如果使用添加到单选按钮的ActionListener,则只需获取ActionEvent的actionCommand属性。

至于将JRadioButtons添加到JPanel,我很确定你已经知道如何做到这一点。如果某个特定步骤让您感到困惑,那么您还没有告诉我们。