【问题标题】:How can I reach an object in jSwing combobox?如何在 jSwing 组合框中到达对象?
【发布时间】:2018-05-16 05:32:45
【问题描述】:

我正在开发一个基于 maven 的 Java 桌面应用程序,并且我正在使用 jSwing 框架作为界面。我需要在组合框中向人们显示任务和他们的名字,但我不确定我是否做得很好。

在此代码部分中,我从数据库中以列表的形式获取 Tasks,然后在组合框中显示它们。

List<TmsTask> task;
    int i;
    try {
        task = Application.getApp().getMainService().getTasksList();
        for (i = 0; i <= task.size(); i++) {
            jComboBoxTask.setModel(new javax.swing.DefaultComboBoxModel<>(new String[]{task.get(i).getTaskName(), 
                                                                                       task.get(i + 1).getTaskName(),
                                                                                       task.get(i + 2).getTaskName()}));
        }

    } catch (Exception ex) {
        Logger.getLogger(BindTask.class.getName()).log(Level.SEVERE, null, ex);
    }

没关系,我可以在组合框中看到任务名称。

问题是;我想使用该任务将其他信息保存到数据库中。但如您所见,选择的东西(在组合框中)只是任务名称,而不是任务对象。

如何将任务对象放在组合框选项部分?

在这段代码中,我曾经尝试从数据库中获取任务对象并在组合框部分显示它们,但组合框部分都显示相同的任务名称。

private void jComboBoxTaskMousePressed(java.awt.event.MouseEvent evt) {                                           
    TmsTask task;

    try {
        task = Application.getApp().getMainService().getTasks();

            jComboBoxTask.setModel(new javax.swing.DefaultComboBoxModel<>(new String[]{task.getTaskName(), 
                                                                                       task.getTaskName(),
                                                                                       task.getTaskName()}));


    } catch (Exception ex) {
        Logger.getLogger(BindTask.class.getName()).log(Level.SEVERE, null, ex);
    }

}

感谢您的帮助,最好的问候。

【问题讨论】:

    标签: java swing button combobox


    【解决方案1】:
    for (i = 0; i <= task.size(); i++) 
    {
        jComboBoxTask.setModel(new javax.swing.DefaultComboBoxModel<>(
           new String[]{task.get(i).getTaskName(), task.get(i + 1).getTaskName(),
    

    您不能继续创建新模型。这意味着只会显示最后一个任务。

    你需要:

    1. 将模型设置在循环之外
    2. 使用组合框的addItem(...) 方法添加每个项目。

    虽然我怀疑你是否应该使用组合框。

    我建议使用JTable,它以行和列的形式显示数据会更好。阅读 How to Use Tables 上的 Swing 教程部分了解更多信息。

    编辑:

    您可以将任何对象存储在组合框中。默认渲染器只是使用对象的toString() 方法在组合框中显示值。

    因此,您可以将Task 对象添加到组合框中,然后您需要创建自定义渲染器以在组合框中显示“任务名称”。有关此主题的更多信息和渲染器的简单示例,请参阅Combobox With Custom Renderer

    【讨论】:

    • 我的主要问题是没有在组合框中显示任务名称,主要问题是它们只是字符串。我的意思是我想在组合框中使用数据来保存表单。所以我需要任务对象的信息,而不仅仅是任务名称。我怎样才能到达任务对象,然后在组合框中显示它们将是一个问题..
    • My main problem is not showing task names at combobox, - 是的。根据提供的代码,您只会显示一个任务名称,而不是任务名称列表。当您提出问题时,请发布正确的代码。您发布的代码完全错误。您创建了一个循环,这意味着有多个任务。如果您的 for 循环多次执行,您将丢失循环第一次迭代的数据。如果只有一项任务,则不需要循环。无论如何,请参阅编辑。
    【解决方案2】:

    @camickr 是正确的(在 cmets 中)。使用组合框显示对象中的所有字段没有多大意义。只需覆盖对象中的toString 方法,默认渲染器就会显示它。

    这是使用简单的 Person 对象(姓名、年龄)的方法。

    package test;
    
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    
    public class ObjectsInComboBox extends JFrame {
        public ObjectsInComboBox() {
            super("combo boxes");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setPreferredSize(new Dimension(300, 300));
            getContentPane().setLayout(new FlowLayout());
    
            JComboBox<Person> personComboBox = new JComboBox<>();
            getContentPane().add(personComboBox);
            pack();
            personComboBox.addItem(new Person("John", 31));
            personComboBox.addItem(new Person("George", 55));
            personComboBox.addItem(new Person("Mike", 12));
            personComboBox.addItem(new Person("Brian", 36));
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> {
                ObjectsInComboBox frame = new ObjectsInComboBox();
                frame.setVisible(true);
            });
        }
    }
    
    class Person {
        private String name;
        private int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return name + " - " + age; //toString override so renderer can show it.
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 2022-07-22
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      相关资源
      最近更新 更多