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

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

0 голосов
/ 22 февраля 2019

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

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

ВЫХОД

enter image description here

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 Ответ

0 голосов
/ 22 февраля 2019

Это прослушивание, но вы проверяете 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) { 
...