【问题标题】:Differentiating between selected items in a JComboBox区分 JComboBox 中的选定项目
【发布时间】:2013-07-25 19:22:40
【问题描述】:

如下所示,我创建了一个 JComboBox,其中包含 'options' 数组中的元素作为列表中的选项。

When a specific item in the list is selected, I want to display the JLabels 'one' or 'two'. 例如。选择选项一显示“一”,选择选项二显示“二”并从显示中删除“一”,反之亦然。

我知道如何添加 JLabels,使用 add();但我不知道如何区分选择了哪个项目。

我在网上搜索并查看了 java 文档,但找不到相关的解决方案。

谢谢

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.lang.*;
import java.util.*;

public class converterPage extends JFrame {
    private JComboBox box;
    private static String[] options = {"Option one", "Option two"};
    private JLabel one, two;

    public converterPage() {
        super("Convert Units"); 
        setLayout (null);

        box = new JComboBox(options);
        box.setBounds(10, 10, 150, 30);
        add(box);

        one = new JLabel("one");
        two = new JLabel("two");
        one.setBounds(170, 10, 150, 30);
        two.setBounds(170, 10, 150, 30);


        box.addItemListener(
            new ItemListener(){ 
                public void itemStateChanged(ItemEvent event){
                    // depending on what is selected, i want to only display certain stuff 
                }   
            }        
        );
    }
}

【问题讨论】:

标签: java swing jframe jcombobox itemlistener


【解决方案1】:

一种方法是使用:JComboBox#getSelectedItem()

【讨论】:

    【解决方案2】:

    你可以使用:

    event.getItem()
    

    获取代表当前选定项目的Object。该对象实际上是一个String,因为组合框是使用Strings 的数组创建的。

    【讨论】:

      【解决方案3】:

      我相信这就是你所追求的:

      import java.awt.event.*;
      import java.util.HashMap;
      import java.util.Map;
      import javax.swing.*;
      
      public class ConverterPage extends JFrame
      {
          private JComboBox box;
          private final Map<String, JLabel> map = new HashMap<>();
      
          public ConverterPage()
          {
              super("Convert Units");
              super.setLayout(null);
      
              final JLabel one = new JLabel("one");
              final JLabel two = new JLabel("two");
              one.setBounds(170, 10, 150, 30);
              two.setBounds(170, 10, 150, 30);
      
              this.map.put("Option one", one);
              this.map.put("Option two", two);
              this.box = new JComboBox(this.map.keySet().toArray(new String[this.map.size()]));
              this.box.setBounds(10, 10, 150, 30);
              super.add(box);
      
              this.box.addItemListener(new ItemListener()
              {
                  @Override
                  public void itemStateChanged(ItemEvent event)
                  {
                      // depending on what is selected, i want to only display certain stuff 
                      final JLabel label = map.get((String) event.getItemSelectable().getSelectedObjects()[0]);
                      System.out.println(label.getText());
                  }
              });
          }
      
          public static void main(String[] args)
          {
              final ConverterPage c = new ConverterPage();
              c.setSize(400, 400);
              c.setVisible(true);
          }
      }
      

      我冒昧地清理了你的导入(你永远不需要从 java.lang 导入,因为它是自动导入的),并且类名应该真的是大写。

      【讨论】:

      • 这会打印出选定的选项,例如'选项一',两次。当我用add替换system.out.println时,为了显示JLabel,它返回了一个错误。
      • @user2587777 它执行了两次,因为有 2 个事件:第一个项目被取消选中,第二个选项被选中(如 event.getStateChange() 所示。add 是什么意思?什么是错误消息?如果您的意思是要将“选项一”链接到JLabel one,您将需要地图或切换方法。
      • 是我希望jlabel一个在jframe上显示“选项一个”时显示,与Jlabel两个具有“选项二”。 span>
      • @user2587777 查看编辑。 label 现在是对应的标签,你可以从那里做任何你想做的事情。
      猜你喜欢
      • 2019-10-26
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多