Проблемы с ItemListener, прикрепленным к JComboBox

Пожалуйста, взгляните на следующий код

    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 будет установлено значение «Выбрано».

Но это не то, что происходит. Вместо этого текст JLabel меняется, как только вы выбираете переключатель!!! Почему это? Пожалуйста помоги!


person JustCause    schedule 14.01.2013    source источник
comment
Это связано с тем, что когда вы добавляете первый элемент в JComboBox, он автоматически выбирается. Это, в свою очередь, вызывает ItemEvent. Я не уверен, чего вы пытаетесь достичь здесь, поскольку ваши поля со списком содержат только одно значение.   -  person Guillaume Polet    schedule 14.01.2013


Ответы (3)


Это из-за 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();
    }



       }
person joey rohan    schedule 14.01.2013

это из-за этого кода в прослушивателе действий вашего переключателя combo.removeAllItems();

когда вы нажимаете переключатель, то перед добавлением этого конкретного текста переключателя в поле со списком вы удаляете все элементы, и после этого единственный элемент, оставшийся в JComboBox, — это тот, который добавляется после нажатия переключателя, который по умолчанию выбран, который затем вызывает ваш JComboBox ' sitemStateChanged, который затем меняет текст на JLabel

person exexzian    schedule 14.01.2013

Здесь ваша потребность выполнена с небольшими изменениями

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");
                }
            }
        }
person vels4j    schedule 14.01.2013
comment
Это по-прежнему изменит текст метки при выборе переключателя. - person joey rohan; 14.01.2013
comment
ItemListener будет запущен, когда вы добавите элементы в поле со списком. OP не хочет ничего делать с меткой при выборе переключателя. Он должен изменить текст при выборе только combobox. Извините, если я не получу ваш код, возможно, вы можете опубликовать небольшой EG в качестве обновления для моего разъяснения? - person joey rohan; 15.01.2013
comment
Код @joeyrohan находится в вопросе, только я внес изменения везде, где это необходимо. - person vels4j; 15.01.2013
comment
Я имею в виду, что насчет Combo's ItemListener - person joey rohan; 15.01.2013