我一直试图弄清楚如何制作一个基于数组内容动态创建的弹出窗口,我几乎可以肯定我错过了一些重要的东西,可以帮助我解决并完全理解这个问题。
我到底想做什么?
我有一个程序循环访问某个目录,收集所有文件夹名称并将其存储在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天。在过去,我试图使用数组来完成类似的任务,但我几乎可以肯定,这是我的一个巨大的逻辑错误,阻止我完成它。
我很欣赏对此事的任何新见解。
答案 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,我很确定你已经知道如何做到这一点。如果某个特定步骤让您感到困惑,那么您还没有告诉我们。