【问题标题】:JComboBox Item ListJComboBox 项目列表
【发布时间】:2012-01-29 14:30:03
【问题描述】:

我想知道如何更改 JComboBox 中项目列表的名称?这是我的代码 我想把它改成狗、熊猫、蜜蜂。而不是选择他们的道路。

import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JFrame;
import javax.swing.ImageIcon;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JComboBox;

public class ComboTest {

    private JLabel imageLabel;
    private JComboBox comboImage;

    private String[] names = {"images/dog.gif","images/bee.gif","images/Panda.gif"};
    private Icon[] icons = {
        new ImageIcon(getClass().getResource(names[0])),
        new ImageIcon(getClass().getResource(names[1])),
        new ImageIcon(getClass().getResource(names[2])),
    };

    public ComboTest(){
        initComponents();
    }

    public void initComponents(){
        JFrame frame = new JFrame("Test Combo");
        frame.setVisible(true);
        frame.setSize(320, 160);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());

        comboImage = new JComboBox(names);
        comboImage.addItemListener(new ItemListener(){
            public void itemStateChanged(ItemEvent event){
                if(event.getStateChange() == ItemEvent.SELECTED){
                    imageLabel.setIcon(icons[comboImage.getSelectedIndex()]);
                }
            }
        });

        frame.add(comboImage);
        imageLabel = new JLabel(icons[0]);
        frame.add(imageLabel);
    }
}

【问题讨论】:

  • 既然我不知道你的目标是什么,你为什么不能声明names = {"Dog","Bee","Panda"}; ?所以你的问题是如何将“Dog”与“images/dog.gif”关联起来,对吗?
  • 这不是作业。我编码是为了好玩..,@themrz 我从来没有想过。谢谢!

标签: java swing jcombobox


【解决方案1】:

您可能希望创建一个具有两个属性的对象,即路径和要显示的文本。

然后您将设置toString 方法以返回文本属性。免责声明:我没有测试任何代码。

public class ValueText {
   private String text;
   private String value;

   public ValueText(final String text, final String value) {
      this.text = text;
      this.value = value;
   }

   @Override
   public String toString() {
      return text;
   }

   public String getValue() {
      return value;
   }
}

然后您可以将初始数组更改为:

private Object[] names = {
   new ValueText("Dog", "images/dog.gif"),
   new ValueText("Bee", "images/bee.gif"),
   new ValueText("Panda", "images/Panda.gif")
};

它应该工作类似,只是现在,当您检查选定的项目时,您可以使用getValue() 方法来获取路径。

您也可能对自定义渲染器感兴趣,但您可能没有必要使用它: http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#renderer

更新在 kleopatra 在 cmets 中提出一些令人信服的论点后,我将继续进行更正,您应该在下面阅读。

一种更通用、更简洁的方法是使用自定义渲染器,即使它非常简单(参见上面的链接)。

【讨论】:

  • 感谢您的努力,但是您不觉得这对于一个简单的操作来说是相当长的吗?
  • @user962206:一种更简单的方法可能是使用 HashMap,但话虽如此,Wes 的建议非常有效,虽然您当前的案例可能是一个微不足道的例子,但他的方法可以稍后应用于更复杂的示例。我建议你听从他的建议 1+ 投票。
  • -1 包装类并覆盖其 toString 不是推荐的方式 - 您需要自定义渲染器
  • @kleopatra 如果他只是想在组合框本身中使用字符串(即“Dog”),我不明白您为什么需要自定义渲染器。
  • @Hovercraft - 应该更清楚:一个除了覆盖 toString 之外什么都不做的包装类是错误的东西(出于视图原因,永远不会覆盖 toString,这是一个肮脏的黑客)一个包装它具有额外的属性(例如上面的 getValue(..) 方法)加上一个使用该方法的渲染器就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多