可编辑的JComboBox给出错误:<identifier>预期和非法的类型启动

时间:2015-11-16 19:45:29

标签: java jcombobox

我正在尝试创建和编辑JComboBox以允许用户键入要购买的歌曲的名称。但是当我设置tunes.setEditable(true);我收到错误......任何帮助都将不胜感激!

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.JTextArea;

    public class JTunes2 extends JFrame implements ItemListener
    {
       int songNum,songPrice;
       int[] songAmount = {2,5,8,1,4,7,12,10,11,3,6,9};

       String result;

       JComboBox tunes = new JComboBox();

       // set as editable 
       tunes.setEditable(true);

       JLabel labelTunes = new JLabel("Song List");
       JLabel outputs = new JLabel();

       FlowLayout layout = new FlowLayout();

    public JTunes2()
    {
       super("Song Selector");
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       JPanel panel = new JPanel();
       panel.setLayout(layout);

      // add song names to combo box and register an item listener.

       tunes.addItem("Song1");
       tunes.addItem("Song2");
       tunes.addItem("Song3");
       tunes.addItem("Song4");
       tunes.addItem("Song5");
       tunes.addItem("Song6");
       tunes.addItem("Song7");
       tunes.addItem("Song8");
       tunes.addItem("Song9");
       tunes.addItem("Song10");
       tunes.addItem("Song11");
       tunes.addItem("Song12");
       tunes.addItemListener(this);


       panel.add(labelTunes);
       panel.add(tunes);

       panel.add(outputs);

     //add panel to the frame
       setContentPane(panel);


    }

    public void itemStateChanged(ItemEvent e)
    {
      //create source object
      Object source = e.getSource();

      //check the type size
      if(source == tunes)
      {
         songNum = tunes.getSelectedIndex();
         songPrice = songAmount[songNum];
         result = "Total Price $" + songPrice;

         //Display result
         outputs.setText(result);
      }


   }
   public static void main(String[] args)
      {
         // create class object
         JTunes frame = new JTunes();
         frame.setSize(250, 180);
         frame.setVisible(true);   
      }
}

谢谢!

2 个答案:

答案 0 :(得分:1)

实际上,Java要求您在构造函数中设置JComponents。为了让你的代码工作,你需要在构造函数中调用setEditable(true),这意味着你只需要移动tunes.setEditable(true);到构造函数。

提示:始终在构造函数中为JComponents分配内存(您希望在创建Jframe后立即绘制组件)。您可以在类级别引用JComboBox。

以下是您的代码的另一个版本:

    import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JTextArea;

public class JTunes2 extends JFrame implements ItemListener
{
   int songNum,songPrice;
   int[] songAmount = {2,5,8,1,4,7,12,10,11,3,6,9};

   String result;

   JComboBox tunes;



   JLabel labelTunes = new JLabel("Song List");
   JLabel outputs = new JLabel();

   FlowLayout layout = new FlowLayout();

public JTunes2()
{
   super("Song Selector");
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   JPanel panel = new JPanel();
   panel.setLayout(layout);

   tunes = new JComboBox();
   // set as editable 
   tunes.setEditable(true);

  // add song names to combo box and register an item listener.

   tunes.addItem("Song1");
   tunes.addItem("Song2");
   tunes.addItem("Song3");
   tunes.addItem("Song4");
   tunes.addItem("Song5");
   tunes.addItem("Song6");
   tunes.addItem("Song7");
   tunes.addItem("Song8");
   tunes.addItem("Song9");
   tunes.addItem("Song10");
   tunes.addItem("Song11");
   tunes.addItem("Song12");
   tunes.addItemListener(this);


   panel.add(labelTunes);
   panel.add(tunes);

   panel.add(outputs);

 //add panel to the frame
   setContentPane(panel);


}


public void itemStateChanged(ItemEvent e)
{
  //create source object
  Object source = e.getSource();

  //check the type size
  if(source == tunes)
  {
     songNum = tunes.getSelectedIndex();
     songPrice = songAmount[songNum];
     result = "Total Price $" + songPrice;

     //Display result
     outputs.setText(result);
  }


}
public static void main(String[] args)
  {
     // create class object
     JTunes2 frame = new JTunes2();
     frame.setSize(250, 180);
     frame.setVisible(true);   
  }
}

答案 1 :(得分:0)

您在类级别添加了tunes.setEditable(true),而不是在方法级别。在班级不允许任何陈述!

这是一个固定版本:我将JTunes2重命名为JTunes以修复编译错误,并将setEditable移动到构造函数。我也修复了缩进 - 这使得更难以犯这个错误:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JTextArea;

public class JTunes extends JFrame implements ItemListener
{
    int songNum,songPrice;
    int[] songAmount = {2,5,8,1,4,7,12,10,11,3,6,9};

    String result;

    JComboBox tunes = new JComboBox();

    JLabel labelTunes = new JLabel("Song List");
    JLabel outputs = new JLabel();

    FlowLayout layout = new FlowLayout();

    public JTunes()
    {
        super("Song Selector");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setLayout(layout);

        tunes.setEditable(true);

        // add song names to combo box and register an item listener.

        tunes.addItem("Song1");
        tunes.addItem("Song2");
        tunes.addItem("Song3");
        tunes.addItem("Song4");
        tunes.addItem("Song5");
        tunes.addItem("Song6");
        tunes.addItem("Song7");
        tunes.addItem("Song8");
        tunes.addItem("Song9");
        tunes.addItem("Song10");
        tunes.addItem("Song11");
        tunes.addItem("Song12");
        tunes.addItemListener(this);


        panel.add(labelTunes);
        panel.add(tunes);

        panel.add(outputs);

        //add panel to the frame
        setContentPane(panel);
    }

    public void itemStateChanged(ItemEvent e)
    {
        //create source object
        Object source = e.getSource();

        //check the type size
        if(source == tunes)
        {
            songNum = tunes.getSelectedIndex();
            songPrice = songAmount[songNum];
            result = "Total Price $" + songPrice;

            //Display result
            outputs.setText(result);
        }
    }

    public static void main(String[] args)
    {
        // create class object
        JTunes frame = new JTunes();
        frame.setSize(250, 180);
        frame.setVisible(true);   
    }
}