【问题标题】:How to use ActionListener on a ComboBox to give a variable a value如何在 ComboBox 上使用 ActionListener 为变量赋值
【发布时间】:2012-12-27 16:27:25
【问题描述】:

我正在使用 BlueJ,但遇到了问题。我有一个包含 3 个选项的组合框。每个选项都是一个字符串。这三个选项是日、周和月。我想要做的是如果选择 Day 而不是变量等于 30(双)等等。有人可以帮我购买告诉我如何根据组合框中的选定选项给“emailvalue”一个值吗?

编辑:我要添加我的实际程序代码,这是一个每月数据计算器。它确实编译。

代码如下:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.event.*;
    import java.awt.image.*;
    import java.awt.geom.*;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Graphics;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    /** 
    * @author (Andrew Napier, Sikander Singh) 
    * @version (December 18th, 2012)
    */
    public class MonthlyData extends JFrame
    {
    private JLabel title, stitle, l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14;
    private JLabel l15,l16,l17,l18,l19,l20,l21,l22,l23,l24,l25,l26,l27,l28,l29;
    private JLabel Usage,Estimated,solu1,solu2,total2;
    private JPanel  panel1, panel2, panel3, panel4, panel5, panel6, panel7;
    String[] deviceStrings = { "Blackberry", "Other", "Internetstick"};
    String[] date = { "Day", "Week", "Month"};
    public double email2 = 0;
    public double email1;
    static final int email50 = 50;
    static final int email100 = 100;
    static final int email150 = 150;
    static final int email200 = 200;
    static final int email250 = 250;
    static final int email300 = 300;
    public JSlider Email = new JSlider(0,300,0);
    public JSlider Web = new JSlider(0,500,0);
    public JSlider IM = new JSlider(0,500,0);
    public JSlider Video = new JSlider(0,300,0);
    public JSlider Song = new JSlider(0,200,0);
    public  JSlider App_G = new JSlider(0,100,0);
    public String currentdate;        
    public double emailvalue;
    public MonthlyData ()
    {
        super ("MonthlyData");
        setSize (1000,1100);    
        ////////////////////////////////////////////////////// panel1
        panel1 = new JPanel ();                                              
        panel1.setLayout (new GridLayout(1,1));
        panel1.setVisible(true);
        panel1.setBackground (Color.black);
        title = new JLabel ("                                     WANNA KNOW HOW MUCH DATA",JLabel.LEFT);
        title.setForeground(Color.white);
        title.setFont (new Font("Times New Roman",Font.BOLD,25));
        l1 = new JLabel ("");
        l2 = new JLabel ("");
        /////////////////////////////////////////////// panel2   
        panel2 = new JPanel ();                                             
        panel2.setLayout (new GridLayout(1,1));
        panel2.setVisible(true);
        panel2.setBackground (Color.gray);
        stitle = new JLabel ("           PICK A PHONE OR INTERNET STICK AND THEN DRAG THE .",JLabel.LEFT);
        stitle.setForeground(Color.black);
        stitle.setFont (new Font("Times New Roman",Font.BOLD,14));
        //////////////////////////////////////////////// panel3
        panel3 = new JPanel ();                                              
        panel3.setLayout (new FlowLayout());
        panel3.setVisible(true);
        panel3.setBackground (Color.white);
        l3 = new JLabel ("Select Your Device:",JLabel.RIGHT);
        l3.setForeground(Color.red);
        JComboBox devicelist = new JComboBox (deviceStrings);
        l4 = new JLabel ("Tell us how much of what's listed here you think you'll use:");
        ///////////////////////////////////////////////// panel4    
        panel4 = new JPanel ();                                               
        panel4.setLayout (new GridLayout(6,7));
        panel4.setVisible(true);
        panel4.setBackground (Color.white);
        l5 = new JLabel ("Email");
        l6 = new JLabel ("WebPage");
        l7 = new JLabel ("Instant Message");
        l8 = new JLabel ("Streaming Video");
        l9 = new JLabel ("Song");
        l10 = new JLabel ("Application or Game");    
        l11 = new JLabel (""+" Emails");
        final JComboBox date1 = new JComboBox (date);
           date1.addActionListener(new ActionListener() {//add actionlistner to listen for change
            @Override
            public void actionPerformed(ActionEvent e) {    
                String s = (String) date1.getSelectedItem();//get the selected item    
                switch (s) {//check for a match
                    case "Day":
                        emailvalue = 30;                            
                        break;
                    case "Week":
                        emailvalue = 4;                            
                        break;
                    case "Month":
                        emailvalue = 1;
                        System.out.println("Month selected, emailvalue:" + emailvalue);
                        break;                        
                }
            }
        });

        l12 = new JLabel ("   0.002 MB");    
        l13 = new JLabel (""+email2+" MB");
        double web1 = 0;
        l14 = new JLabel (""+web1+" WebPages");
        JComboBox date2 = new JComboBox (date);
        l15 = new JLabel ("  0.07 MB");
        double web2 = 0;
        l16 = new JLabel (""+web2+" MB");
        double IM1 = 0;
        l17 = new JLabel (""+IM1+" IMs");
        JComboBox date3 = new JComboBox (date);
        l18 = new JLabel ("  0.005 MB");
        double IM2 = 0;
        l19 = new JLabel (""+IM2+" MB");
        double video1 = 0;
        l20 = new JLabel (""+video1+" Minutes");
        JComboBox date4 = new JComboBox (date);
        l21 = new JLabel ("   1 MB");
        double video2 = 0;
        l22 = new JLabel (""+video2+" MB");
        double song1 = 0;
        l23 = new JLabel (""+song1+" MP3's");
        JComboBox date5 = new JComboBox (date);
        l24 = new JLabel ("    4 MB");
        double song2 = 0;
        l25 = new JLabel (""+song2+" MB");
        double app1 = 0;
        l26 = new JLabel (""+app1+" App/Games");
        JComboBox date6 = new JComboBox (date);
        l27 = new JLabel ("   0.44 MB");
        double app2 = 0;
        l28 = new JLabel (""+app2+" MB");
        //////////////////////////////////////////////// panel5
        panel5 = new JPanel ();                                            
        panel5.setLayout (new GridLayout(1,1));
        panel5.setVisible(true);
        panel5.setBackground (Color.white);
        solu1 = new JLabel ("WE THINK YOUR MONTHLY DATA USAGE WILL BE:");
        solu1.setForeground (Color.red);
        solu1.setFont (new Font("Times New Roman",Font.BOLD,20));
        double total = 0;
        total2 = new JLabel (""+total+" MB");
        total2.setForeground (Color.red);
        total2.setFont (new Font("Times New Roman",Font.BOLD,20));
        /////////////////////////////////////////// panel6
        panel6 = new JPanel ();
        panel6.setLayout (new GridLayout (1,1));
        panel6.setVisible (true);
        panel6.setBackground (Color.white);
        Usage = new JLabel ("Usage per unit");
        Usage.setForeground (Color.red);
        Estimated = new JLabel ("     Estimated total");
        Estimated.setForeground (Color.red);
        ////////////////////////////////////////////// panel7
        panel7 = new JPanel ();
        panel7.setLayout (new GridLayout (1,1));
        panel7.setVisible (true);
        panel7.setBackground (Color.white);
        solu2 = new JLabel ("Data usage varies by device and other factors and the .");
        solu2.setForeground (Color.black);
        /////////////////////////////////////////////////// Implements
        Container container = getContentPane ();
        container.setLayout (null);      //changed
        container.setBackground (Color.white);

        container.add (panel1).setBounds (0,0,1000,120);        //panel1
        panel1.add (title).setSize(500,500);

        container.add (panel2).setBounds (0,100,1000,120);      //panel2
        panel2.add (stitle);

        container.add (panel3).setBounds (0,220,1000,100);      //panel3
        panel3.add (l3);
        panel3.add (devicelist);
        panel3.add (l4);

        container.add (panel4).setBounds (0,340,1000,150);      //panel4
        Email.addChangeListener(new SliderHandler());
        Web.addChangeListener(new SliderHandler());
        IM.addChangeListener(new SliderHandler());
        Video.addChangeListener(new SliderHandler());
        Song.addChangeListener(new SliderHandler());
        App_G.addChangeListener(new SliderHandler());

        panel4.add (l5);
        panel4.add (Email);
        panel4.add (l11);
        panel4.add (date1);
        panel4.add (l12);
        panel4.add (l13);
        panel4.add (l6);
        panel4.add (Web);
        panel4.add (l14);
        panel4.add (date2);
        panel4.add (l15);
        panel4.add (l16);
        panel4.add (l7);
        panel4.add (IM);
        panel4.add (l17);
        panel4.add (date3);
        panel4.add (l18);
        panel4.add (l19);
        panel4.add (l8);
        panel4.add (Video);
        panel4.add (l20);
        panel4.add (date4);
        panel4.add (l21);
        panel4.add (l22);
        panel4.add (l9);
        panel4.add (Song);
        panel4.add (l23);
        panel4.add (date5);
        panel4.add (l24);
        panel4.add (l25);
        panel4.add (l10);
        panel4.add (App_G);
        panel4.add (l26);
        panel4.add (date6);
        panel4.add (l27);
        panel4.add (l28);
        container.add (panel5).setBounds (210,540,1000,50);    // panel5
        panel5.add (solu1);
        panel5.add (total2);
        container.add (panel6).setBounds (670,220,200,220);      // panel6
        panel6.add (Usage);
        panel6.add (Estimated);

        container.add (panel7).setBounds (210,580,530,50);    // panel7
        panel7.add (solu2);

        Email.setOpaque(false);
        Web.setOpaque(false);
        IM.setOpaque(false); 
        Video.setOpaque(false); 
        Song.setOpaque(false);
        App_G.setOpaque(false); 
        setVisible (true);
    }

    public static void main (String[] args)
    {
        MonthlyData application = new MonthlyData ();
    }        

    public class SliderHandler implements ChangeListener
    {
        public void stateChanged(ChangeEvent e)
        {
            if (e.getSource().equals(Email))
            {
                l11.setText(""+Email.getValue());    
                email2= (Email.getValue() * 0.002);
                l13.setText(email2 + "MB");
            }
            if (e.getSource().equals(Web))
            {
                l14.setText(""+Web.getValue());
            }    
            if (e.getSource().equals(IM))
            {
                l17.setText(""+IM.getValue());
            }    
            if (e.getSource().equals(Video))
            {
                l20.setText(""+Video.getValue());
            }    
            if (e.getSource().equals(Song))
            {
                l23.setText(""+Song.getValue());
            }    
            if (e.getSource().equals(App_G))
            {
                l26.setText(""+App_G.getValue());
            }    
        }
    }

    public void paint (Graphics g)
    {
        super.paint(g);    
    }
}

【问题讨论】:

    标签: java swing actionlistener jcombobox


    【解决方案1】:

    1) 首先,您需要将 ActionListener 添加到 JComboBox 以监听所选项目的更改。

    2) 在ActionListeneractionPerformed(...) 中,通过getSelectedItem() 获取所选项目并转换为String,因为该方法返回Object

    3) 使用switch 语句检查所选项目与哪一项匹配,即日、月、周,然后相应地分配一个值。

    例如:

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    
    public class MonthlyData {
    
        public double emailvalue;
        private String[] date = {"Day", "Week", "Month"};
        private JFrame frame;
    
        public MonthlyData() {
            frame = new JFrame();//use an instance rather than extending the class
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
            final JComboBox date1 = new JComboBox(date);
    
            ActionListener cbActionListener = new ActionListener() {//add actionlistner to listen for change
                @Override
                public void actionPerformed(ActionEvent e) {
    
                    String s = (String) date1.getSelectedItem();//get the selected item
    
                    switch (s) {//check for a match
                        case "Day":
                            emailvalue = 1.1;
                            System.out.println("Day selected, emailvalue:" + emailvalue);
                            break;
                        case "Week":
                            emailvalue = 2.2;
                            System.out.println("Week selected, emailvalue:" + emailvalue);
                            break;
                        case "Month":
                            emailvalue = 3.3;
                            System.out.println("Month selected, emailvalue:" + emailvalue);
                            break;
                        default:
                            emailvalue = 4.4;
                            System.out.println("No match selected, emailvalue:" + emailvalue);
                            break;
                    }
                }
            };
    
            date1.addActionListener(cbActionListener);
    
            frame.add(date1);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new MonthlyData();
                }
            });
        }
    }
    

    更新:

    在您添加 SSCCE 并发表评论后:

    如果你进入 SliderHandler 类,输入 email2=(Email.getValue() * 0.002)*emailvalue;如果你做标签不会 实时更新。但是如果你用 5 替换 emailvalue,它 会更新

    问题是

    在启动时,emailvalue 尚未设置。它只会在第一次更改所选项目/索引时设置。

    要解决这个问题,我们必须简单地通过在可见之前调用setSelectedItem(..) 给它一个默认选择值:

    final JComboBox date1 = new JComboBox(date);
    date1.addActionListener(new ActionListener() {//add actionlistner to listen for change
        @Override
        public void actionPerformed(ActionEvent e) {
    
            String s = (String) date1.getSelectedItem();//get the selected item
    
            switch (s) {//check for a match
                case "Day":
                    emailvalue = 30;
                    break;
                case "Week":
                    emailvalue = 4;
                    break;
                case "Month":
                    emailvalue = 1;
                    System.out.println("Month selected, emailvalue:" + emailvalue);
                    break;
            }
        }
    });
    date1.setSelectedItem(date[0]);//set Day as default selected item/emailvalue
    

    对您的代码的建议:

    • 应通过SwingUtilities.invokeLater(Runnable r) 块在EDT 上创建和操作Swing 组件。

    • 不要覆盖 paint(..)JFrame,而是添加 JPanel 并覆盖 paintComponent(Graphics g)

    • 不要调用setBoundssetSize,而是使用适当的LayoutManager 和/或覆盖JPanelgetPreferredSize() 并返回适合其内容的Dimensions,而不是在@ 上调用pack() 987654349@ 设置为可见之前。

    • 不要不必要地扩展JFrame

    • 不要在该类上实现ActionListener,除非该类将被用作一个类并且/或其方法必须暴露给其他类

    【讨论】:

    • 我没有发布所有代码,我只发布了组合框位。我正在制作一个程序,我必须在其中添加 Jpanels 等,所以我认为扩展 Jframe 会更容易
    • @Sunny 不,这是不好的做法,如果我们想通过简单的方法调用添加尚不存在/超出功能的功能,我们应该只扩展一个类。也被视为您是新手,请阅读:How does accepting an answer work?,因为一旦您找到合适的解决方案,这将适用。
    • 它确保编译器知道我们正在覆盖另一个类的特定方法。因此,如果我们没有正确覆盖该方法,即我们输入了错误的名称或其他内容,则会在我们添加 @Override 注释时给出编译器错误。如果我们不这样做,它会编译并假设我们添加了一个新方法。更多信息请参见here
    • 如果我再次使用 (new ActionListener) 我收到一个错误,说明它的抽象并且无法实例化
    • @Sunny 我已经测试了我的代码,它编译得很好,请复制并粘贴我的 sn-p 并测试它,而不是复制片段。我还需要查看代码来为您提供错误原因。听起来像你正在尝试做 ActionListener al=new ActionListener(); 的艰难,因为此类是抽象的,因此无法完成,因此必须覆盖 actionPerformed
    【解决方案2】:

    只需有一张地图并在选择监听器中使用它。

    HashMap<String,Integer> map = new HashMap();
    map.put("Day",1);
    map.put("Week",7);
    map.put("Month",30);
    

    【讨论】:

      【解决方案3】:

      actionListener 添加到JComboBox

      JComboBox date1 = new JComboBox (date);
      date1.addActionListener(new ActionListener(){
          public void actionPerformed(ActionEvent e)
          {
              String selectedItem = (String) date1.getSelectedItem();
              if(selectedItem.equals("date")
              {
                  emailValue = 30;
              }
          }
      });
      

      由于您的类已经实现了ActionListener,您也可以这样做(作为上述方法的替代方案):

      actionCommand 添加到您的JComboBox

      JComboBox date1 = new JComboBox (date);
      date1.setActionCommand("date1");
      date1.addActionListener(this)
      

      注意:date1 应该是一个类级别的变量(字段),以便actionPerformed 方法可以访问它。

      在类中添加一个actionPerformed 方法(你很可能已经有了这个)。

      public void actionPerformed(ActionEvent ae)
      {
          if(ae.getActionCommand().equals("date1")
          {
              String selectedItem = date1.getSelectedItem();
              if(selectedItem.equals("date")
              {
                 emailValue = 30;
              }
              …
              //Note: From Java 7, you can use Strings with switch
          }
      }
      

      【讨论】:

      • 我尝试了上面的代码 Nivas,但是当我运行它时,我得到一个错误,说 java.awt.event.ActionListener 是抽象的;无法实例化。如果我尝试 date1.addActionListener(this) 我得到一个错误,说找不到变量数据 1 并且它突出显示 data1.getselectedItem()
      • @Sunny:你需要有date1.addActionListener(this)(添加到答案)。对于这个 date1 应该是一个类级别的变量。
      • 我尝试了你的第二个答案,我收到一个错误,上面写着不兼容的类型,它突出显示 String selectedItem = date1.getselectedItem();
      • -1 表示在 OP 表示它无法正常工作后无法编译的代码。 @Sunny 请参阅my answer,您应该将返回的值转换为String,如我的回答中所述(该方法返回Object),如下所示:String selectedItem = (String)date1.getselectedItem();
      • @Sunny 您需要转换为字符串,因为 getSelectedItem 返回一个对象。我已经更新了代码。 @DavidKroukamp 答案只是指向正确方法的指针。基本的编译器错误应该很容易解决。我的目的不是提供工作代码。我的目的是提供正确的方法。
      【解决方案4】:

      这只是一个例子

      implements ItemListener //on your class addItemListener to your combo
      
      
      public void itemStateChanged(ItemEvent e) {
      
           String i = "" + cboMonth.getSelectedItem();
           String b = "" + cboMonth1.getSelectedItem();
           System.out.println("The number  Start:" + i);
           System.out.println("The number End:" + b);
           if(e.getStateChange() == ItemEvent.SELECTED){
                int mSatrt = Integer.parseInt(i);
                int mEnd = Integer.parseInt(b);
                // System.out.println("The number m FROM ITEMSTATE is:" + mSatrt +"   == " + "M1 is :  "+ mEnd);
      
                if(mSatrt >= mEnd){ JOptionPane.showMessageDialog (this, " Next Date Payment est moin que la date de paiement" + mSatrt + ">=" + "" + mEnd);}
                    //else if (mSatrt> mEnd) { JOptionPane.showMessageDialog (this, "la date Erroné" + mSatrt + ">" + "" + mEnd);}
                    //else{JOptionPane.showMessageDialog (this, "la date Erroné" + mSatrt + "=" + "" + mEnd);}
                }
          }
      }
      

      【讨论】:

      • 也许你应该edit你的答案来描述更多。
      猜你喜欢
      • 2021-07-08
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 2017-02-19
      • 1970-01-01
      • 2016-03-17
      • 2013-02-25
      相关资源
      最近更新 更多