【问题标题】:JFrame and ItemListener IssuesJFrame 和 ItemListener 问题
【发布时间】:2015-05-19 08:42:08
【问题描述】:

我无法弄清楚类的调试。

正如 cmets 所说,它需要让用户输入披萨配料,然后将价格返还。它有代码,但我不知道从哪里开始调试。

任何事情都会有所帮助,或者即使您有类似的工作代码也会有所帮助。我想学习它,但确实需要帮助。因此,提前感谢您在正确方向上的任何帮助/推动。

// 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 implements ItemListener
{
   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);
      pizzaBox.addItemListener(this);
      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(totalprice);
   }
   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[x];
         output = "Pizza Price $" + totalPrice;
         totPrice.setText(output);
      }
   }
}

【问题讨论】:

  • “我想学习它,但确实需要帮助。” 您还需要一个(具体的)问题。你有什么问题?
  • 确定您遇到的问题并关注可能会出现的类似问题...
  • 我不知道如何修复我得到的编译错误。我修复了除 4 之外的所有内容,它们位于“公共类 DebugFourteen3”部分“add(totalPrice);”中,它说它找不到“list.getSource();”的符号我特别相信列表部分,最后一个在组件'pizzaPrice [x]'中说不公开。这些都是我遇到的所有可见问题,很抱歉造成混淆。
  • 此重要信息不应出现在评论中,而应出现在您的问题中。请通过在代码中明确显示发生错误的位置来澄清您的问题。
  • 此外,如果您的代码有多个编译器错误,那么这表明您的编码风格可能需要修复。不要输入大量代码然后进行测试。相反,如果您不能使用现代 IDE,例如 NetBeans 或 Eclipse(它几乎会立即警告您编译问题),那么您应该尽早并经常编译您的代码,最重要的是在当前编译问题得到解决之前不要添加任何新代码。否则,您最终会遇到难以修复的错误。

标签: java swing jframe components itemlistener


【解决方案1】:
  • add(totalprice);int,不能添加到 Container。请改用JLabelJTextFieldJFormattedTextField
  • public void itemStateChanged(ItemEvent[] list) { 不是ItemListener 合同要求的有效签名。请参阅JavaDocs 以了解符合合同要求的要求方法签名,这将处理至少两个其他错误
  • totalPrice = pizzaPrice[x];, x 未定义(或者更重要的是,它在Component 中定义为private 变量,您可以引用它,我想您想要pizzaNum

就个人而言,我认为您会发现使用ActionListener 而不是ItemListener 更容易,因为您只关心所选项目的变化,而不是从旧所选项目到新所选项目的变化

【讨论】:

    【解决方案2】:

    以下是更正后的代码:

    // DebugFourteen3
    // User selects pizza topping and sees price
    import java.awt.FlowLayout;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    
    //use correct spelling of class name
    public class DebugFourteen3 extends JFrame implements ItemListener {
        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);
            pizzaBox.addItemListener(this);
            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);
        }
    
        public static void main(String[] arguments) {
            JFrame frame = new DebugFourteen3();
            frame.setSize(200, 150);
            frame.setVisible(true);
        }
    
        @Override
        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);
            }
        }
    }
    

    错误是:

    • 实现接口时,需要定义其所有方法或将类标记为抽象类。在您的类中,缺少接口 ItemListener 的 public void itemStateChanged(ItemEvent list) 方法。您的类有一个方法itemStateChanged(ItemEvent[] list),但此方法中的参数与接口方法不匹配。所以修改了这个方法的参数。

    • add(totalprice); totalprice 是一个整数值,您不能将它添加到 JFrame。其实你需要加JTextField totPrice

    • 在方法 itemStateChanged(ItemEvent[] list) 中,变量 x 未定义。实际上,您需要组合中选定项目的索引才能从 pizzaPrice 数组中获取其价格。所以将x替换为pizzaNum

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多