【问题标题】:Java Swing custom JComboBox Model can't display options correctlyJava Swing 自定义 JComboBox 模型无法正确显示选项
【发布时间】:2021-10-07 22:09:44
【问题描述】:

我正在尝试创建一个名为 MyComboBoxModel 的自定义 JComboBox 模型。在模型中指定了项目列表。每个项目都是 CompanyDropItem 类的一个实例。我似乎能够用 5 个项目填充组合框,但它们没有正确显示。下拉列表显示内存地址列表,而不是每个 CompanyDropItem 的 .companyName_ 值。另外,我不相信我已将其设置为在选择更改时正确返回每个 CompanyDropItem 的 .companyId_ 值。

代码只是试图让概念发挥作用的游乐场。我可以发布创建下拉列表的整个代码:

package Package;

import java.awt.Color;
import java.awt.Panel;

import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

    static MyComboBoxModel model;


    public static void main(String[] args) {
        // TODO Auto-generated method stub

        JFrame frame = new JFrame();
        frame.setSize(200, 200);

        JPanel panel = new JPanel();
        panel.setBackground(Color.red);
        frame.add(panel);

        model = new MyComboBoxModel();

        CompanyDropItem[] items = new CompanyDropItem[5];
        items[0] = new CompanyDropItem(1, "A");
        items[1] = new CompanyDropItem(2, "B");
        items[2] = new CompanyDropItem(3, "C");
        items[3] = new CompanyDropItem(4, "D");
        items[4] = new CompanyDropItem(5, "E");
        model.companyDropItems = items;

        JComboBox cbox = new JComboBox(model);
        cbox.setMaximumRowCount(5);
        frame.add(cbox);

        frame.setVisible(true);
    }
    
    
    static class MyComboBoxModel extends AbstractListModel implements ComboBoxModel {

        public CompanyDropItem[] companyDropItems;

        String selection = null;

        public Object getElementAt(int index) {
            return companyDropItems[index];
        }

        public int getSize() {
            return companyDropItems.length;
        }

        public void setSelectedItem(Object anItem) {
            // ?
        }

        public Object getSelectedItem() {
            return selection;
        }
    }

    private static class CompanyDropItem {
        final int companyId_;
        final String companyName_;

        private CompanyDropItem(int companyId, String companyName) {
            companyId_ = companyId;
            companyName_ = companyName;
        }
    }


}

感谢您的帮助

【问题讨论】:

  • 你需要实现CompanyDropItem.toString() 你不需要make up different names 为ctor 参数顺便说一句。下划线:仅限于大写的常量名称。包名中没有大写字母
  • 不需要使用自定义的ComboBoxModel。

标签: java swing jcombobox


【解决方案1】:

啊,是的,谢谢,这似乎有效。

package Package;

import java.awt.Color;
import java.awt.Panel;

import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

    static MyComboBoxModel model;


    public static void main(String[] args) {
        // TODO Auto-generated method stub

        JFrame frame = new JFrame();
        frame.setSize(200, 200);

        JPanel panel = new JPanel();
        panel.setBackground(Color.red);
        frame.add(panel);

        model = new MyComboBoxModel();

        CompanyDropItem[] items = new CompanyDropItem[5];
        items[0] = new CompanyDropItem(1, "A");
        items[1] = new CompanyDropItem(2, "B");
        items[2] = new CompanyDropItem(3, "C");
        items[3] = new CompanyDropItem(4, "D");
        items[4] = new CompanyDropItem(5, "E");
        model.companyDropItems = items;

        JComboBox cbox = new JComboBox(model);
        cbox.setMaximumRowCount(5);
        frame.add(cbox);

        frame.setVisible(true);
    }
    
    
    static class MyComboBoxModel extends AbstractListModel implements ComboBoxModel {

        public CompanyDropItem[] companyDropItems;

        CompanyDropItem selection = null;

        public Object getElementAt(int index) {
            return companyDropItems[index];
        }

        public int getSize() {
            return companyDropItems.length;
        }

        public void setSelectedItem(Object anItem) {
            selection = (CompanyDropItem)anItem;
        }

        public Object getSelectedItem() {
            return selection;
        }
    }

    private static class CompanyDropItem {
        final int companyId_;
        final String companyName_;

        private CompanyDropItem(int companyId, String companyName) {
            companyId_ = companyId;
            companyName_ = companyName;
        }
        public String toString() {
            return companyName_;
        }
    }


}

【讨论】:

  • 是的。养成使用@Override 的习惯也很好——当你出错时它会告诉你
  • 您的自定义对象也应该实现equals(...)hashCode() 方法,否则像setSelectedItem(...) 这样的方法将不起作用。请参阅:Combo Box With With Hidden Data 了解可重用类。 Item.java 类实现了这两种方法。
猜你喜欢
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
相关资源
最近更新 更多