首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中的侦听器有问题。我有一个下拉框不能像我需要的那样通过用户选择

Java中的侦听器有问题。我有一个下拉框不能像我需要的那样通过用户选择
EN

Stack Overflow用户
提问于 2015-03-31 02:46:19
回答 2查看 75关注 0票数 0

本周三我有一个课程项目要交,并且遇到了一些问题:我有两个if else语句来控制在两个不同的下拉菜单中呈现的值。对我来说,我似乎没有得到前一个下拉列表的信息(有两个下拉列表影响下一个下拉列表中的值)。

到目前为止,我的代码如下:

代码语言:javascript
运行
复制
///Occupancy///
JLabel label2 = new JLabel("Please Select the Number of Occupants");
JComboBox occupancy_list = new JComboBox(occupancy_string);
occupancy_list.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent event)//Listener for Occupancy Drop Down
      {
          JComboBox cb = (JComboBox)event.getSource(); //grab the user selection
          String selection = (String) cb.getSelectedItem();
          int number = Integer.parseInt((String) selection);
      }
});
String selection = (String) occupancy_list.getSelectedItem();
int number = Integer.parseInt((String) selection);
if(number>2)
{
  style=(style2);
}
else
{
  style=(style1);
}

///Room Type///
JLabel label3 = new JLabel("Please Select a Room Style");

//Creates RoomStyle Drop Down
JComboBox room_type = new JComboBox(style);
roomtype_string=(String) room_type.getSelectedItem();
room_type.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent event)//Listener for Room Style Drop Down
      {

          JComboBox cb = (JComboBox)event.getSource(); //grab the user selection
          String selection = (String) cb.getSelectedItem();

      }
});
String selection2 = (String) room_type.getSelectedItem();
if(selection2.equals("Cabin"))
{
  room_number=(cabin_string);
}
else
{
  room_number=(suite_string);
}

///Room Selection///
JLabel label4 = new JLabel("Please Select a Room");

//Creates RoomNumber Drop Down
JComboBox room_list = new JComboBox(room_number);
roomselected = (String) room_list.getSelectedItem();
room_list.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent event)//Listener for Occupancy Drop Down
      {
          JComboBox cb = (JComboBox)event.getSource(); //grab the user selection
          String selection = (String) cb.getSelectedItem();
      }
});
String selection3 = (String) room_list.getSelectedItem();

//Dining
JLabel label5 = new JLabel("Please Select a Dining Time");
JComboBox dining_list = new JComboBox(dining_string);
dining_list.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent event)//Listener for Occupancy Drop Down
      {
          JComboBox cb = (JComboBox)event.getSource(); //grab the user selection
          String selection = (String) cb.getSelectedItem();
      }
});
String selection4 = (String) dining_list.getSelectedItem();

注意:我已经重写了我的代码,仍然没有骰子:`//创建带有占用率、房间类型、房间和用餐时间请求的子面板JPanel = JPanel();

代码语言:javascript
运行
复制
    ///Occupancy///
    JLabel label2 = new JLabel("Please Select the Number of Occupants");
    JComboBox occupancy_list = new JComboBox(occupancy_string);
    Occupancy_Listener occupancy = new Occupancy_Listener();
    occupancy_list.addActionListener(occupancy);
    //updateStyle(occupancy_string[occupancy_list.getSelectedIndex()]);

    ///Room Type///
    JLabel label3 = new JLabel("Please Select a Room Style");

    //Creates RoomStyle Drop Down
    JComboBox room_type = new JComboBox(style);
    Style_Listener styleListen = new Style_Listener();
    room_type.addActionListener(styleListen);
    //updateNumber(style[room_type.getSelectedIndex()]);

    ///Room Selection///
    JLabel label4 = new JLabel("Please Select a Room");

    //Creates RoomNumber Drop Down
    JComboBox room_list = new JComboBox(room_number);
    Room_Listener room = new Room_Listener();
    room_list.addActionListener(room);
    //updateRoom(room_number[room_list.getSelectedIndex()]);

    //Dining
    JLabel label5 = new JLabel("Please Select a Dining Time");
    JComboBox dining_list = new JComboBox(dining_string);
    Din_Listener dining = new Din_Listener();
    dining_list.addActionListener(dining);
    //updateDin(dining_string[dining_list.getSelectedIndex()]);
    ...
    ...
    ...
    ...
    ...
  }

  private class Occupancy_Listener implements ActionListener
  {
      public void actionPerformed(ActionEvent event)//Listener for Occupancy Drop Down
      {
          JComboBox cb = (JComboBox)event.getSource(); //grab the user selection
          String selection = (String) cb.getSelectedItem();
          System.out.println(selection);
          System.out.println(style[0]);
          System.out.println(room_number[0]);
          updateStyle(selection);
      }

  }

  private class Style_Listener implements ActionListener
  {
      public void actionPerformed(ActionEvent event)//Listener for Occupancy Drop Down
      {


          JComboBox cb = (JComboBox)event.getSource(); //grab the user selection
          String selection = (String) cb.getSelectedItem();
          updateNumber(selection);

      }
  }
  private class Room_Listener implements ActionListener
  {
      public void actionPerformed(ActionEvent event)//Listener for Occupancy Drop Down
      {
          JComboBox cb = (JComboBox)event.getSource(); //grab the user selection
          String selection = (String) cb.getSelectedItem();
          updateRoom(selection);
      }
  }
  private class Din_Listener implements ActionListener
  {
      public void actionPerformed(ActionEvent event)//Listener for Occupancy Drop Down
      {
          JComboBox cb = (JComboBox)event.getSource(); //grab the user selection
          String selection = (String) cb.getSelectedItem();
          updateDin(selection);
      }
  }
  protected void updateStyle(String pick) 
  {
      String[] style1 ={"Cabin", "Suite"};
      String[] style2 ={"Suite"};
      //ocu_string=pick;
      number = Integer.parseInt(pick);
      if(number>2)
      {
        style=style2;
      }
      else
      {
        style=style1;
      }
  }
  protected void updateNumber(String pick) 
  {
      String[] cabin_string = {"11-1","11-2","11-3","11-4","11-5","11-6","11-7","11-8","11-9","11-10"};
      String[] suite_string = {"11-S1","11-S2"};
      type=pick;
      if(type.equals("cabin"))
      {
          room_number=cabin_string;
      }
      else
      {
          room_number=suite_string;
      }
  }
  protected void updateRoom(String pick) 
  {
      room_num=pick;
  }
  protected void updateDin(String pick) 
  {
      din_time=pick;
  }
  //public String getPopulation()
  {
      //return ocu_string;
  }
EN

回答 2

Stack Overflow用户

发布于 2015-03-31 03:06:38

这可能是你要问的问题。您从第一个组合框中选择一个项目,它将填充第二个组合框中的项目:

代码语言:javascript
运行
复制
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class ComboBoxTwo extends JPanel implements ActionListener
{
    private JComboBox<String> mainComboBox;
    private JComboBox<String> subComboBox;
    private Hashtable<String, String[]> subItems = new Hashtable<String, String[]>();

    public ComboBoxTwo()
    {
        String[] items = { "Select Item", "Color", "Shape", "Fruit" };
        mainComboBox = new JComboBox<String>( items );
        mainComboBox.addActionListener( this );

        //  prevent action events from being fired when the up/down arrow keys are used
        mainComboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
        add( mainComboBox );

        //  Create sub combo box with multiple models

        subComboBox = new JComboBox<String>();
        subComboBox.setPrototypeDisplayValue("XXXXXXXXXX"); // JDK1.4
        add( subComboBox );

        String[] subItems1 = { "Select Color", "Red", "Blue", "Green" };
        subItems.put(items[1], subItems1);

        String[] subItems2 = { "Select Shape", "Circle", "Square", "Triangle" };
        subItems.put(items[2], subItems2);

        String[] subItems3 = { "Select Fruit", "Apple", "Orange", "Banana" };
        subItems.put(items[3], subItems3);
    }

    public void actionPerformed(ActionEvent e)
    {
        String item = (String)mainComboBox.getSelectedItem();
        Object o = subItems.get( item );

        if (o == null)
        {
            subComboBox.setModel( new DefaultComboBoxModel() );
        }
        else
        {
            subComboBox.setModel( new DefaultComboBoxModel( (String[])o ) );
        }
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new ComboBoxTwo() );
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
票数 0
EN

Stack Overflow用户

发布于 2015-03-31 03:52:25

您可能会对匿名类(或本地类)中的代码不能与周围的代码同时执行的事实感到困惑。

因此,在一个看起来像这样的代码中:

代码语言:javascript
运行
复制
A a = new A();
a.setSomething( new B() {
    public void bMethod() {
        // Run stuff
    }
} );
C c = a.getSomething();

"Run stuff“部分现在没有运行。创建一个对象,其中包含一个稍后可以在其中使用的方法,然后将该对象传递给。该方法不会运行,直到某个特定的对象调用它。当您到达getSomething()时,"Run stuff“部分还没有运行。

所以在你的代码中:

代码语言:javascript
运行
复制
JComboBox occupancy_list = new JComboBox(occupancy_string);
occupancy_list.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent event)//Listener for Occupancy Drop Down
      {
          JComboBox cb = (JComboBox)event.getSource(); //grab the user selection
          String selection = (String) cb.getSelectedItem();
          int number = Integer.parseInt((String) selection);
      }
});
String selection = (String) occupancy_list.getSelectedItem();

创建占用列表,为其创建操作侦听器,并将该操作侦听器存储在占用列表中。但是,在显示图形用户界面、用户选择某些内容以及触发事件之前,actionPerformed()方法中编写的任何内容都不会运行。

GUI编程不同于控制台编程,在控制台编程中,您调用"scan()“,然后程序就会停止并等待输入内容。首先准备GUI,当您显示它时,将根据用户的操作调用各种侦听器。

因此,您的代码甚至在列表添加到图形用户界面之前就直接跳转到occupancy_list.getSelectedItem(),当然,没有选择任何内容,也没有显示任何内容,所以其他下拉列表甚至在用户看到图形用户界面之前就已经创建好了。

对于代码中的所有操作侦听器都是如此。

编写操作侦听器的正确方法是考虑GUI已经运行时的条件。您的操作侦听器只是在将要丢弃的局部变量中设置值。相反,它们应该在用户做出选择时执行您想要执行的操作,就在操作侦听器内部。

这意味着这个组合框的操作侦听器必须创建其他列表,并将它们添加到GUI中,重新验证和重新绘制它。或者,它可以简单地修改已经创建的其他列表,这取决于您认为最好的列表。但它们必须访问这些列表,因此这些列表必须定义为周围类的字段,并在操作侦听器中进行访问。请注意,您还可以定义一个执行此操作的方法,并从操作侦听器内部调用它。

我的建议是先创建一个简单的GUI,只有第一个组合框,然后根据选择改变一些简单的东西。例如,您可以遵循Oracle Tutorial。在了解了如何编写更改简单内容的操作侦听器之后,展开程序以添加其他列表,并在操作侦听器中对其进行操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29353834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档