ComboBox не слушает события

Это приложение показывает фрейм, который содержит различные JComboBox и JLabel. Событие должно генерироваться, когда пользователь щелкает последний элемент (комбинированный список стилей), и текст в JLabel должен быть отформатирован в соответствии с выбранными вариантами в каждом комбинированном списке.

Когда я нажимаю на поле со стилем, ничего не происходит.
Есть еще одна ошибка, которую я не смог понять:(

ВЫХОД

package labtasksix;

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Color;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class MyFrame extends JFrame {

    String NameO []= {"Select name:","TimesRoman","Serif","SansSerif","Monospaced"};
    String ColorO[]={"Select color:","RED","BLUE","GREEN"};
    String SizeO []={"Select size:","8","12","16","20"};
    String StyleO[]={"Select style:","BOLD","ITALIC","PLAIN"};

   JLabel lbl= new JLabel("Text Formatted");
   JComboBox Name= new JComboBox(NameO);
   JComboBox Colour= new JComboBox(ColorO);
   JComboBox Size= new JComboBox(SizeO);
   JComboBox Style= new JComboBox(StyleO);

    public MyFrame() {
        super("Format Frame");
        setLayout(new FlowLayout());
        add(Name);
        add(Size);
        add(Style);
        add(Colour);
        add(lbl);
        Name.setMaximumRowCount(3);
        Size.setMaximumRowCount(3);
        Style.setMaximumRowCount(3);
        Colour.setMaximumRowCount(3);
    EventHandler handler= new EventHandler();
    Style.addItemListener(handler);
    }

    class EventHandler implements ItemListener{

    @Override
    public void itemStateChanged(ItemEvent e) {

        //When user chooses from the last combobox (style)
        if(e.getSource()==Style)
        {
        if(Name.getSelectedItem().equals("BOLD"))
              {
             lbl.setFont(new Font((String)Name.getSelectedItem(),Font.BOLD, (int) Size.getSelectedItem()));
              }

        if(Name.getSelectedItem().equals("ITALIC"))
              {
              lbl.setFont(new Font((String)Name.getSelectedItem(),Font.ITALIC, (int) Size.getSelectedItem()));

              }
        if(Name.getSelectedItem().equals("PLAIN"))
        {
             lbl.setFont(new Font((String)Name.getSelectedItem(),Font.PLAIN, (int) Size.getSelectedItem()));

        }
        if(Colour.getSelectedItem().equals("RED"))
              {

               lbl.setForeground(Color.red);
              }
         if(Colour.getSelectedItem().equals("BLUE"))
              {

               lbl.setForeground(Color.BLUE);
              }
          if(Colour.getSelectedItem().equals("GREEN"))
              {

               lbl.setForeground(Color.GREEN);
              }

        }
    }
    }
    }

1 ответ

Это слушает, но вы проверяете ComboBox.getSelectedItem(), который не был обновлен во время события. Элемент, к которому относится событие, упоминается в самом событии; вызов e.getItem() чтобы получить его:

Object item = e.getItem();
if (item.equals("BOLD")) {
    lbl.setFont(new Font((String) item, Font.BOLD, /* wrong: (int) Size.getSelectedItem() */ 8));
}

Ваш расчет размера (прокомментированный выше) тоже неверен. Ваше поле выбора размера содержит Stringsтак что вам придется их анализировать (или менять модель на целые).

Кроме того... вы получите два события для каждого изменения, ItemEvent.DESELECTED сначала (для старого элемента), затем ItemEvent.SELECTED, Вы должны проверить интересующее вас событие:

if (e.getSource() == Style && e.getStateChange() == ItemEvent.SELECTED) { 
Другие вопросы по тегам