当前位置: 首页 > 知识库问答 >
问题:

在两个JComboBox之间共享相同的模型

方河
2023-03-14

我有一个人[]有三个人(p1,p2,p3)。Person类有两个属性name和email。

我使用了以下代码。

    Person p1 = new Person("Smith", "smith@mail.com");
    Person p2 = new Person("Tom", "tom@gmail.com");
    Person p3 = new Person("John","john@mail.com");

    Person[] per_arr = new Person[] { p1, p2, p3};

    JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    JComboBox<String> combo1 = new JComboBox<String>();
    JComboBox<String> combo2 = new JComboBox<String>();

    for (Person p : per_arr) {
        combo1.addItem(p.getName());
        combo2.addItem(p.getEmail());
    }
    panel.add(combo1);
    panel.add(combo2);
    frame.setContentPane(panel);
    frame.pack();
    frame.setVisible(true);

但我不想这样用。我想使用两个组合框与相同的型号。我尝试使用DefaultComboBoxModel并重写getElementAt()方法,如下所示。

public class MyModel extends DefaultComboBoxModel<Object> {

public MyModel(Object[] items) {
    super(items);
}

@Override
public Object getElementAt(int index) {
    if (super.getElementAt(index) instanceof Person) {
        return (Person)super.getElementAt(index);
    } else {
        return null;
    }
}

}

问题是如何使用相同的ComboBoxModel在一个JComboBox中添加Person[]的所有名称,并在另一个JComboBox中添加所有电子邮件。

共有1个答案

宫高义
2023-03-14

使用ComboBoxModel的一个实例和JComboBox的两个实例,每个实例具有相同的模型。让每个JComboBox都有一个自定义呈现器,用于显示该JComboBox所需的Person属性。

在下面的示例中,每个组合都获得实现策略模式的单个呈现器的自己的实例,并传递一个函数 ,该函数在调用呈现器时选择正确的属性:

DefaultComboBoxModel model = new DefaultComboBoxModel(…);
JComboBox<String> combo1 = new JComboBox<>(model);
combo1.setRenderer(new PersonRenderer(Person::getName));
JComboBox<String> combo2 = new JComboBox<>(model);
combo2.setRenderer(new PersonRenderer(Person::getEmail));
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.util.function.Function;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;

/**
 * @see http://stackoverflow.com/a/37222598/230513
 */
public class ComboRendererTest {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new FlowLayout());
        DefaultComboBoxModel model = new DefaultComboBoxModel(new Person[]{
            new Person("Alpher", "alpher@example.com"),
            new Person("Bethe", "bethe@example.com"),
            new Person("Gammow", "gammow@example.com")});
        JComboBox<String> combo1 = new JComboBox<>(model);
        combo1.setRenderer(new PersonRenderer(Person::getName));
        JComboBox<String> combo2 = new JComboBox<>(model);
        combo2.setRenderer(new PersonRenderer(Person::getEmail));
        f.add(combo1);
        f.add(combo2);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private static class PersonRenderer extends DefaultListCellRenderer {

        Function<Person, String> personAttribute;

        public PersonRenderer(Function<Person, String> personAttribute) {
            this.personAttribute = personAttribute;
        }

        @Override
        public Component getListCellRendererComponent(JList<?> list, Object
            value, int index, boolean isSelected, boolean cellHasFocus) {
            JLabel l = (JLabel) super.getListCellRendererComponent(
                list, value, index, isSelected, cellHasFocus);
            Person p = (Person) value;
            l.setText(personAttribute.apply(p));
            return l;
        }
    }

    private static class Person {

        private final String name;
        private final String email;

        public Person(String name, String email) {
            this.name = name;
            this.email = email;
        }

        public String getName() {
            return name;
        }

        public String getEmail() {
            return email;
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new ComboRendererTest()::display);
    }
}
 类似资料:
  • 在Java中,对于两个JVM(运行在同一台物理机器上),是否有办法使用/共享相同的内存地址空间?假设JVM-1中的生产者将消息放在特定的预定义内存位置,如果JVM-2上的消费者知道要查看哪个内存位置,那么它是否可以检索消息?

  • 问题内容: 我正在将AngularJS与c#mvc一起使用。我有一个主页,用户可以在其中输入一些数据,并将其传递给第二个模块,在该模块中,我将使用这些数据进行处理和决策。我必须使用第二个模块中第一个模块中输入或更新的数据。有人可以帮我实现这个目标吗? 问题答案: 希望以下实现可以帮助您有所了解。

  • 我正在试图弄清楚如何在Helm中的两个图表之间共享数据。 在两个图表之间共享configmap的最佳实践是什么?

  • 问题内容: 假设我有一个要注入到config中的模块: 有两个子模块: 这是第一个: 第二个是相同的,以简化示例: 您会注意到,您可以将它们作为提供者来访问以配置选项: 如果我们在控制器中,则可以覆盖每个范围,例如: 但是,如果他们总是共享相同的财产怎么办?如何在提供商之间共享某些东西? 我可以同时为和注入和配置共享属性吗? 如何同时访问和作为单个模块的扩展? 问题答案: 将模块插入两个共享这些属

  • 我有大约60个套接字和20个线程,我想确保每个线程每次都在不同的套接字上工作,所以我根本不想在两个线程之间共享同一个套接字。 在我的类中,我有一个后台线程,它每60秒运行一次并调用方法。在方法中,我迭代我拥有的所有套接字,然后通过调用类的方法开始逐个ping它们,并根据响应将它们标记为活的或死的。在方法中,我总是需要迭代所有套接字并ping它们以检查它们是活的还是死的。 现在,所有读取器线程将并发

  • 问题内容: 我需要在两个(或更多个)组合框之间共享数据,但是我想独立选择元素。例如,如果我在第一个comboBox中选择Object1,则我的第二个ComboBox也选择Object1,因为它们具有相同的模型(DefaultComboBoxModel,并且此模型还管理所选的对象)。但是我不想要这种行为。我想在我的comboBoxes中独立选择对象。当我在第一个comboBox中选择对象时,我的第二