ItemListener附加到JComboBox的问题

时间:2013-01-14 18:41:11

标签: java swing user-interface jcombobox jradiobutton

请查看以下代码

    import java.awt.event.*;
    import java.awt.*;
    import javax.swing.*;

    public class ComboIssue extends JFrame
    {
        private JRadioButton rOne, rTwo;
        private ButtonGroup group;

        private JComboBox combo;

        private JLabel label;

        public ComboIssue()
        {
            rOne = new JRadioButton("One");
            rOne.addActionListener(new ROneAction());
            rTwo = new JRadioButton("Two");
            rTwo.addActionListener(new RTwoAction());
            group = new ButtonGroup();
            group.add(rOne);
            group.add(rTwo);

            combo = new JComboBox();        
            combo.addItem("No Values");
            combo.addItemListener(new ComboAction());

            label = new JLabel("labellLabel");

            this.setLayout(new FlowLayout());
            this.add(rOne);
            this.add(rTwo);
            this.add(combo);
            this.add(label);


        this.pack();
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        }

        private class ROneAction implements ActionListener
        {
            public void actionPerformed(ActionEvent ae)
            {
                combo.removeAllItems();
                combo.addItem("One");
            }
        }

        private class RTwoAction implements ActionListener
        {
            public void actionPerformed(ActionEvent ae)
            {
                combo.removeAllItems();
                combo.addItem("Two");
            }
        }

        private class ComboAction implements ItemListener
        {
            public void itemStateChanged(ItemEvent ie)
            {
                if(ie.getStateChange() == ItemEvent.SELECTED)
                {
                    label.setText("Selected");
                }
            }
        }

        public static void main(String[]args)
        {
            new ComboIssue();
        }



}

这就是我所期待的,

  1. 选择一个单选按钮。它将替换组合框中的值。
  2. 从组合框中选择一个值。现在JLabel文本将设置为“Selected”
  3. 但是,这不是正在发生的事情。相反,只要您选择单选按钮,JLabel文本就会更改!为什么是这样?请帮忙!

3 个答案:

答案 0 :(得分:1)

这是ComboAction implements ItemListener的结果。 你不是在改变组合框的价值吗? 当您选择单选按钮的值时?

<强>更新

嗯,你的代码有点问题。当你有一个ItemListener时,它改变了标签的值。所以我采用了PopupMenuListener,当列表变得不可见时它会被拍摄。工作得很好你想要的。

代码:

     import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class ComboIssue extends JFrame
{
    private JRadioButton rOne, rTwo;
    private ButtonGroup group;

    private JComboBox combo;

    private JLabel label;

    public ComboIssue()
    {
        rOne = new JRadioButton("One");
        rOne.addActionListener(new ROneAction());
        rTwo = new JRadioButton("Two");
        rTwo.addActionListener(new RTwoAction());
        group = new ButtonGroup();
        group.add(rOne);
        group.add(rTwo);

        combo = new JComboBox();
        combo.addItem("No Values");
        combo.addPopupMenuListener(new javax.swing.event.PopupMenuListener() {
        public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) {
        }
        public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {
            jComboBox1PopupMenuWillBecomeInvisible(evt);
        }
        public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {
        }
    });

        label = new JLabel("labellLabel");

        this.setLayout(new FlowLayout());
        this.add(rOne);
        this.add(rTwo);
        this.add(combo);
        this.add(label);


    this.pack();
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    private class ROneAction implements ActionListener
    {
        public void actionPerformed(ActionEvent ae)
        {
            combo.removeAllItems();
            combo.addItem("One");
        }
    }

    private class RTwoAction implements ActionListener
    {
        public void actionPerformed(ActionEvent ae)
        {
            combo.removeAllItems();
            combo.addItem("Two");
        }
    }

       private void jComboBox1PopupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {
   label.setText("selected");

}

    public static void main(String[]args)
    {
        new ComboIssue();
    }



       }

答案 1 :(得分:1)

因为你的单选按钮的动作监听器中有这个代码 combo.removeAllItems();

当您单击单选按钮时,然后在将特定单选按钮文本添加到组合框之前,您将删除所有项目 在此之后,JComboBox中剩下的唯一项目是在点击单选按钮后添加的项目,默认情况下该项目会调用JComboBox的{​​{1}},然后更改itemStateChanged上的文字1}}

答案 2 :(得分:1)

这里需要做一些小改动

private class ROneAction implements ActionListener
    {
        public void actionPerformed(ActionEvent ae)
        {
            label.setText("Nothing Selected");   
            combo.removeAllItems();
            combo.addItem("One");
        }
    }

      private class RTwoAction implements ActionListener
      {
        public void actionPerformed(ActionEvent ae)
        {
            label.setText("Nothing Selected");
            combo.removeAllItems();
            combo.addItem("Two");
        }
       }
        private class ROneAction implements ActionListener
        {
            public void actionPerformed(ActionEvent ae)
            {
                combo.removeAllItems();
                combo.addItem("Select");
                combo.addItem("One");
            }
        }

        private class RTwoAction implements ActionListener
        {
            public void actionPerformed(ActionEvent ae)
            {
                combo.removeAllItems();
                combo.addItem("Select");
                combo.addItem("Two");
            }
        }

        private class ComboAction implements ItemListener
        {
            public void itemStateChanged(ItemEvent ie)
            {
                if(ie.getItem().equals("Two"))
                {
                    label.setText("Two Selected");
                } else if(ie.getItem().equals("One") ) {
                    label.setText("One Selected");
                }
            }
        }