Как использовать .DefaultListCellRenderer - PullRequest
1 голос
/ 26 марта 2010

Во-первых, я новичок в Java-программировании, и мой родной язык не английский, но все же я надеюсь получить некоторую помощь от всех вас. То, что я пытаюсь сделать, - это простой java-интерфейс с jComboBox и jList. Я хочу заполнить jComboBox объектными именами, и когда пользователь выберет одно из имен, получит идентификатор объекта, который я буду использовать для заполнения jList. Это, вероятно, просто, но у меня бин застрял с этой проблемой весь день.

private void loadComboBox() {
        biz.Object object = new biz.Object();
        try {
            ArrayList<biz.Object> arrayOfObjects= object.getAllObjects();// ArrayList of objects
            for (biz.Object o:arrayOfObjects)
            {
                 if (o != null)
                     cbm.addElement(o); //`toString-method


            }
 cb.setModel(cbm); //JComboBox  

Ответы [ 2 ]

1 голос
/ 26 марта 2010

Я не уверен на 100%, правильно ли я понимаю ваш вопрос - но вполне может быть, что вам даже не нужно реализовывать свой собственный CellRenderer. Возможно, следующий код будет вам полезен?

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Test extends JPanel implements ItemListener {
    private JComboBox comboBox;
    private JList list;

    public Test() {
        comboBox = new JComboBox();
        list = new JList(new DefaultListModel());

        /* initialize combo box */
        loadComboBox();

        /* listen for combo box selections */
        comboBox.addItemListener(this);

        /* simple layout */
        setLayout(new BorderLayout());
        add(comboBox, BorderLayout.NORTH);
        add(new JScrollPane(list), BorderLayout.CENTER);
    }

    /**
     * Invoked when an item has been selected or deselected by the user.
     */
    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.SELECTED) {
            /* add item to list */
            ((DefaultListModel) list.getModel()).addElement(e.getItem());
        }
    }

    private void loadComboBox() {
        /* let's fake some content here */
        Object[] objects = { "foo", "bar", "baz", "qux",
                             "quux", "corge", "grault",
                             "garply", "waldo", "fred",
                             "plugh", "xyzzy", "thud" };

        /* put the objects into the combo box */
        comboBox.setModel(new DefaultComboBoxModel(objects));
    }

    public static void main(String[] args) {
        Test test = new Test();

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(test);

        frame.setSize(300, 400);

        frame.setVisible(true);
    }
}
1 голос
/ 26 марта 2010

В большинстве случаев компонент качания можно рассматривать как многоуровневый разработчик контроллера модели.

Из того, что вы сказали, я понимаю, что вы хотите, когда один из ваших объектов выбран в JComboBox, поместите этот объект в свой JList.

Во-первых, я бы посоветовал вам взглянуть на учебник Swing для JComboBox .

Тогда вы увидите, что у вас есть некоторые возможности для обработки событий, отправленных JComboBox.

  • Добавление ActionListener к вашему JComboBox. он будет уведомляться каждый раз, когда на вашем JComboBox выполняется действие, и, как следствие, довольно интенсивно. Как следствие, он может быть не самым лучшим.
  • Добавление ItemListener в ваш JComboBox. он будет уведомлен каждый раз, когда выбранный элемент изменяется. Но количество звонков зависит от предыдущего статуса выбора.

Я подозреваю, что второй вариант предпочтительнее первого, поскольку он работает с данными модели комбинированного блока, а не полагается исключительно на видимое состояние компонента (что сначала делать, в некоторой степени - конечно, меньше, чем MouseListener, но больше секунды).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...