Не могу добавить новый элемент с всплывающей подсказкой в ​​JComboBox (Java Swing) - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть JComboBox, который содержит элементов, которые имеют всплывающую подсказку .Чтобы добавить всплывающие подсказки, я использовал здесь решение для работы со стеком Java Swing: текст при наведении курсора на элементы JComboBox? .Теперь я хочу сделать еще один шаг вперед и добавить новые элементы в поле со списком и добавить новую подсказку для каждого нового элемента.

Чтобы проверить это, я создал простой тестовый проект с помощью поля со списком.и кнопка.Когда вы нажимаете кнопку, новый элемент создается и добавляется в выпадающий список.Моя проблема в том, что я не могу понять, как я могу одновременно добавить правильную подсказку.В этом случае кажется, что я не могу вручную добавить строку подсказки в список.

import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;

public class ComboBoxWithToolTips extends JPanel
{
    JComboBox<String> combo;
    ComboboxToolTipRenderer renderer;

    JButton button;

    String[] items;
    List<String> tooltips;

    public ComboBoxWithToolTips()
    {
        items = new String[] {"red", "blue", "black"};
        tooltips = Arrays.asList(new String[] {"a", "b", "c"});
        combo = new JComboBox<>(items);
        renderer = new ComboboxToolTipRenderer();
        renderer.setTooltips(tooltips);
        combo.setRenderer(renderer);
        add(combo);

        button = new JButton("Add");
        button.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                Random random = new Random();
                String name = "new" + random.nextInt(100);
                String tooltip = name + " tooltip";

                combo.addItem(name); // Add the new item
                renderer.tooltips.add(tooltip); // Add the new tooltip to the list
            }
        });
        add(button);
    }

    public class ComboboxToolTipRenderer extends DefaultListCellRenderer
    {
        List<String> tooltips;

        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus)
        {

            JComponent comp = (JComponent) super.getListCellRendererComponent(
                    list, value, index, isSelected, cellHasFocus);

            if (-1 < index && null != value && null != tooltips)
            {
                list.setToolTipText(tooltips.get(index));
            }
            return comp;
        }

        public void setTooltips(List<String> tooltips)
        {
            this.tooltips = tooltips;
        }
    }

    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Tooltip Test");

        ComboBoxWithToolTips comboBoxWithToolTips = new ComboBoxWithToolTips();
        comboBoxWithToolTips.setPreferredSize(new Dimension(500, 500));
        frame.getContentPane()
            .add(comboBoxWithToolTips);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
    }
}

Рамка открывается, и у каждого элемента в выпадающем списке есть всплывающая подсказка.Но когда я нажимаю кнопку «Добавить», я получаю следующее исключение:

Исключение в потоке «AWT-EventQueue-0» java.lang.UnsupportedOperationException в java.util.AbstractList.add (Неизвестный источник) в java.util.AbstractList.add (неизвестный источник) в ComboBoxWithToolTips $ 1.actionPerformed (ComboBoxWithToolTips.java:48) в javax.swing.AbstractButton.fireActionPerformed (неизвестный источник) в javax.swuttonerformed) в javax.swing.DefaultButtonModel.fireActionPerformed (неизвестный источник) в javax.swing.DefaultButtonModel.setPressed (неизвестный источник) в javax.swing.plaf.basic.BasicButtonListener.mouseReleased (неизвестный источник) в java.awentproom ()Неизвестный источник) в javax.swing.JComponent.processMouseEvent (Неизвестный источник) в java.awt.Component.processEvent (Неизвестный источник) в java.awt.Container.processEvent (Неизвестный источник) в java.awt.Component.dispatchEventImpl (Неизвестный источник) в java.awt.Container.dispatchEventImpl (неизвестный источник)на java.awt.Component.dispatchEvent (неизвестный источник) на java.awt.LightweightDispatcher.retargetMouseEvent (неизвестный источник) на java.awt.LightweightDispatcher.processMouseEvent (неизвестный источник) на java.awt.LightweightDispatcher.dava неизвестный источник (неизвестный источник).awt.Container.dispatchEventImpl (неизвестный источник) в java.awt.Window.dispatchEventImpl (неизвестный источник) в java.awt.Component.dispatchEvent (неизвестный источник) в java.awt.EventQueue.dispatchEventImpl (неизвестный источник).EventQueue.access $ 500 (неизвестный источник) на java.awt.EventQueue $ 3.run (неизвестный источник) на java.awt.EventQueue $ 3.run (неизвестный источник) на java.security.AccessController.doPrivileged (собственный метод) на java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (Неизвестный источник) в java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (Неизвестный источник) в java.awt.EventQueue $ 4.run (Неизвестный источник) в java) в java.security.AccessController.doPrivileged (собственный метод) в java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (неизвестный источник) в java.awt.EventQueue.dispatchEvent (неизвестный источник) в java.awt.EventDispatchThread.pumpOneEventawt.Ent.pumpEventsForFilter (неизвестный источник) в java.awt.EventDispatchThread.pumpEventsForHierarchy (неизвестный источник) в java.awt.EventDispatchThread.pumpEvents (неизвестный источник) в java.awt.EventDispatchThread.pumpEvents (неизвестный источник) в (неизвестный источник) вНеизвестный источник)

Решение из ранее упомянутой темы stackoverflow работает только для инициализации , но не для динамического добавления новых элементов .

Кто-нибудь видит ошибку или есть специальный тип JComboBox для того, что я пытаюсь сделать?

Заранее спасибо!

1 Ответ

0 голосов
/ 13 сентября 2018

Это из-за этой строки:

tooltips = Arrays.asList(new String[] {"a", "b", "c"});

Arrays.asList возвращает неизменный список, и вы не можете добавлять к нему элементы.

Вы можете создать изменяемый список, как этот:

tooltips = new ArrayList<>(Arrays.asList(new String[] {"a", "b", "c"}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...