2012-01-29 53 views
1

我想知道如何更改我的JComboBox中的商品列表的名称?这是我的代码 我想将其更改为Dog,Panda,Bee。而不是选择他们的路径。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); 
    } 
} 
+3

为什么-o-为什么他们不再读:http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html – kleopatra 2012-01-29 14:36:15

+0

这个功课? – 2012-01-29 14:37:39

+0

由于我不知道你的目标是什么,为什么你不能声明姓名= {“狗”,“蜜蜂”,“熊猫”}; ? 所以你的问题是如何将“Dog”关联到“images/dog.gif”我是否正确? – thermz 2012-01-29 14:41:07

回答

2

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

然后,您将设置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

更新我会继续和改正,你应该在下面阅读。

这样做的更通用和更干净的方法是使用自定义渲染器,即使它非常简单(请参阅上面的链接)。

+0

感谢您的努力,但是您不认为这对于简单操作来说是相当长的吗? – user962206 2012-01-29 14:49:00

+0

@ user962206:一个更简单的方法是使用HashMap ,但是说Wes的推荐是相当有效的,虽然你当前的情况可能是一个简单的例子,但他的方法可以应用于更复杂的例子后来。我建议你按照他的建议1+加票。 – 2012-01-29 14:53:43

+0

-1包装类和覆盖它的toString不是推荐的方式 - 自定义渲染器是你需要的 – kleopatra 2012-01-29 14:58:10