【问题标题】:Could someone tell me why my actionListener for-loop is not working?有人能告诉我为什么我的 actionListener for-loop 不起作用吗?
【发布时间】:2014-03-01 20:29:01
【问题描述】:

我有一个程序,它接受一个输入文件,从中提取一个颜色字 + 十六进制值(例如红色 0xFF0000)。我的代码工作得很好,除了我试图用 HashMap 替换我的 2 个数组列表......那是事情发生了错误的地方。我的代码恢复到我认为之前的状态,但现在按下单选按钮时它不会改变颜色。有人想看看吗?

public HashMapTests() {
        JPanel p1 = new JPanel();
        this.getContentPane().setLayout(new GridLayout(5,4));
        ButtonGroup group = new ButtonGroup();
        for (int i = 0; i < colorCollection.size(); i++) {
            jrbColor[i] = new JRadioButton(colorCollection.get(i));
            jrbColor[i].setText(colorCollection.get(i));
            group.add(jrbColor[i]); 
            p1.add(jrbColor[i]);
            }
        for(int i = 0; i < colorCollection.size(); i++){
            jrbColor[i].addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e){
                    for (int j = 0; j < colorCollection.size(); j++){
                        String hexColor = hexCollection.get(j);
                        if(hexCollection.get(j).equals(((JRadioButton)e.getSource()).getText())){
                            getContentPane().setBackground(Color.decode(hexColor));

                            repaint();
                        }
                    }                   
            }
        }); 
        }
        add(p1);
            }

【问题讨论】:

  • 是时候做一点调试了,我想。
  • 您的输入文件看起来如何?
  • @LeosLiterak:它们很可能有两列字符串——颜色名称后跟颜色 int 十六进制字符串的字符串表示形式。即Red 0xffff0000。无论如何,这是我的猜测。
  • 你的HashMap在哪里?我看到两个 ArrayList。
  • @LeosLiterak 我无法让 HashMap 以我希望的方式运行,所以我放弃了它并返回到两个数组。我打算继续研究 HashMap。是的,我的输入看起来像:Gray 0x707070 Purple 0x990099 Orange 0xFF6600 LightBlue 0x6666FF

标签: java swing for-loop actionlistener


【解决方案1】:

第一次调查:

while (colorCollection.size() < 10)

应替换为

if (colorCollection.size() < 10)

第二次观察:

jrbColor[i] = new JRadioButton(colorCollection.get(i));
jrbColor[i].setText(colorCollection.get(i));

第二行没用,见构造函数的javadoc。

第三:

附加监听器的第二个循环没用,你可以把这段代码放到你创建按钮的第一个循环中。

最后:

if (hexCollection.get(j).equals(((JRadioButton) e.getSource()).getText())) {

您将此处的 hexCollection 内容与单选按钮文本进行比较,但该按钮具有来自 colorCollection 的标签。我无法查看您的文件,但我认为这将是问题所在。

地图解决方案:

初始化

String name = fileInput.next();
String hexValue = fileInput.next();
colors.put(name, hexValue);

按钮

    int i = 0;
    for (String s : colors.keySet()) {
        jrbColor[i] = new JRadioButton(s);
        group.add(jrbColor[i]);
        p1.add(jrbColor[i]);
        jrbColor[i].addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String hexColor = colors.get(((JRadioButton) e.getSource()).getText());
            getContentPane().setBackground(Color.decode(hexColor));
        }
        });
    }

【讨论】:

  • 你完全明白了单选按钮不起作用的原因。啊!现在我可以回去尝试让一个哈希图在这个坏男孩身上工作。
  • 对不起,我刚刚发布了 hashmap 解决方案 :-)
  • 我之前唯一想不通的部分是如何使用 HashMap 生成按钮。 for (int i = 0; i &lt; colors.size(); i++) { jrbColor[i] = new JRadioButton(colors.get(i)); group.add(jrbColor[i]); p1.add(jrbColor[i]); } 只是没有产生它们。我之前遇到的同一个地方:(
  • 现在更清楚了吗?看地图界面,javadoc是个强大的工具
  • 非常感谢你,狮子座。我非常感谢。现在我看到它在我面前,它绝对更有意义。
猜你喜欢
  • 2019-02-15
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 2022-12-04
  • 2015-09-12
  • 2023-01-22
  • 1970-01-01
  • 2018-10-07
相关资源
最近更新 更多