【问题标题】:about ItemEvent in java GUI关于 java GUI 中的 ItemEvent
【发布时间】:2013-12-07 07:22:17
【问题描述】:

我正在用 Java GUI 做一个小程序 这是mu代码:

    // DebugFourteen3
// User selects pizza topping and sees price
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

//use correct spelling of class name
public class DebugFourteen3 extends JFrame
{ 
   FlowLayout flow = new FlowLayout();
   JComboBox pizzaBox = new JComboBox();
   JLabel toppingList = new JLabel("Topping List");
   JLabel aLabel = new JLabel("Paulos's American Pie");
   JTextField totPrice = new JTextField(10);
   int[] pizzaPrice = {7,10,10,8,8,8,8};
   int totalPrice = 0;
   String output;
   int pizzaNum;
   public DebugFourteen3()
   {
      super("Pizza List");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setLayout(flow);
      add(toppingList);
      pizzaBox.addItem("cheese");
      pizzaBox.addItem("sausage");
      pizzaBox.addItem("pepperoni");
      pizzaBox.addItem("onion");
      pizzaBox.addItem("green pepper");
      pizzaBox.addItem("green olive");
      pizzaBox.addItem("black olive");
      add(pizzaBox);
      add(aLabel);
      add(totPrice);
      itemStateChanged(this);
   }

   public static void main(String[] arguments)
   {
      JFrame frame = new DebugFourteen3();
      frame.setSize(200, 150);
      frame.setVisible(true);
   }

   public void itemStateChanged(ItemEvent[] list)
   {
      Object source = list.getSource();
      if(source == pizzaBox)
      {
         int pizzaNum = pizzaBox.getSelectedIndex();
         totalPrice = pizzaPrice[pizzaNum];
         output = "Pizza Price $" + totalPrice;
         totPrice.setText(output);
      }
   }
}

编译器在第 35 行告诉我错误,它说 itemStateChanged() 应该接收一个类型为 ItemEvent[] 的参数,但我正在传递“this”(它自己的类)

谁能解释 itemStateChanged 如何与 JComboBox 一起工作? 谢谢

【问题讨论】:

    标签: java swing user-interface jcombobox


    【解决方案1】:

    您必须在组合框上添加侦听器,而不是直接调用itemStateChanged 方法。添加侦听器将在单击事件发生时启用回调,并且 jvm 将在为事件注册组合框时自动调用itemStateChanged 方法。替换这一行

      itemStateChanged(this);
    

    pizzaBox.addItemListener(this);
    

    【讨论】:

      【解决方案2】:

      首先,您需要实现ItemListenerJFrame。比使用pizzaBox 添加以下行,这将通知覆盖public void itemStateChanged(ItemEvent ev) 方法ItemListener

      pizzaBox.addItemListener(this);
      

      详情请见tutorial

      【讨论】:

        【解决方案3】:

        问题:

        1.您没有为JComboBox注册itemListener
        2.itemStateChanged 事件将ItemEvent 作为参数而不是ItemEvent[] 数组

        1.替换这个:

        itemStateChanged(this);
        

        用这个:

        pizzaBox.addItemListener(this);
        

        2.替换这个:

        public void itemStateChanged(ItemEvent[] list)
        

        有了这个:

        public void itemStateChanged(ItemEvent list)
        

        完整代码:

        // DebugFourteen3
        // User selects pizza topping and sees price
        import javax.swing.*;
        import java.awt.*;
        import java.awt.event.*;
        
        //use correct spelling of class name
        public class DebugFourteen3 extends JFrame
        { 
           FlowLayout flow = new FlowLayout();
           JComboBox pizzaBox = new JComboBox();
           JLabel toppingList = new JLabel("Topping List");
           JLabel aLabel = new JLabel("Paulos's American Pie");
           JTextField totPrice = new JTextField(10);
           int[] pizzaPrice = {7,10,10,8,8,8,8};
           int totalPrice = 0;
           String output;
           int pizzaNum;
           public DebugFourteen3()
           {
              super("Pizza List");
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              setLayout(flow);
              add(toppingList);
              pizzaBox.addItem("cheese");
              pizzaBox.addItem("sausage");
              pizzaBox.addItem("pepperoni");
              pizzaBox.addItem("onion");
              pizzaBox.addItem("green pepper");
              pizzaBox.addItem("green olive");
              pizzaBox.addItem("black olive");
              add(pizzaBox);
              add(aLabel);
              add(totPrice);
              pizzaBox.addItemListener(this);
           }
        
           public static void main(String[] arguments)
           {
              JFrame frame = new DebugFourteen3();
              frame.setSize(200, 150);
              frame.setVisible(true);
           }
        
           public void itemStateChanged(ItemEvent list)
           {
              Object source = list.getSource();
              if(source == pizzaBox)
              {
                 int pizzaNum = pizzaBox.getSelectedIndex();
                 totalPrice = pizzaPrice[pizzaNum];
                 output = "Pizza Price $" + totalPrice;
                 totPrice.setText(output);
              }
           }
        }
        

        【讨论】:

          【解决方案4】:

          这里thisDebugFourteen3 不是ItemEvent 类型。这就是为什么

          itemStateChanged(ItemEvent[] list)
          

          给出错误。

          如果你想处理itemStateChanged,那么你需要实现ItemLisntener并将actionListner添加到它

          pizzaBox.addItemListener(this);
          

          还添加ItemLisntener的Handler方法为

          public void itemStateChanged(....)
          {
              //Handling Code  goes here
          }
          

          或者你也可以实现ActionListner 有关如何使用组合框的更多信息,您可以访问here

          【讨论】:

            猜你喜欢
            • 2012-02-04
            • 1970-01-01
            • 2012-05-04
            • 1970-01-01
            • 2013-04-30
            • 1970-01-01
            • 2013-05-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多