ComboBox没有收听事件

问题描述 投票:1回答:1

此应用程序显示包含不同JComboBox和JLabel的框架。当用户单击最后一个(样式组合框)时应生成一个事件,并且应根据每个组合框中的选定选项格式化JLabel中的文本。

当我点击Style组合框时没有任何反应。 还有另一个我无法弄清楚的错误:(

OUTPUT

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);
              }

        }
    }
    }
    }
java swing oop jcombobox eventhandler
1个回答
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) { 
© www.soinside.com 2019 - 2024. All rights reserved.