【问题标题】:Can't add a new item with tooltip to JComboBox (Java Swing)无法将带有工具提示的新项目添加到 JComboBox (Java Swing)
【发布时间】:2019-02-18 06:49:20
【问题描述】:

我有一个 JComboBox,其中包含 都有工具提示的项目。要添加工具提示,我在这里使用了 stackoverflow 解决方案 Java Swing: Mouseover text on JComboBox items?。现在我想更进一步,将新项目添加到组合框,并为每个新项目添加一个新的工具提示。

为了对此进行测试,我创建了一个带有组合框和按钮的简单测试项目。单击该按钮时,将创建一个新项目并将其添加到组合框中。我的问题是我无法弄清楚如何同时添加正确的工具提示。在这种情况下,似乎不允许我手动将工具提示字符串添加到列表中。

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(Unknown Source) 在 javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(未知来源)在 javax.swing.DefaultButtonModel.setPressed(未知来源)在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知 源)在 java.awt.Component.processMouseEvent(未知源)在 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.dispatchEvent(未知来源)在 java.awt.Container.dispatchEventImpl(未知来源)在 java.awt.Window.dispatchEventImpl(未知来源)在 java.awt.Component.dispatchEvent(未知来源)在 java.awt.EventQueue.dispatchEventImpl(未知来源)在 java.awt.EventQueue.access$500(未知来源)在 java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知 来源)在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知 源)在 java.awt.EventQueue$4.run(未知源)在 java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(未知 源)在 java.awt.EventQueue.dispatchEvent(未知源)在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知 来源)在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(Unknown Source) 在 java.awt.EventDispatchThread.run(未知来源)

前面提到的 stackoverflow 主题的解决方案仅适用于初始化,但不适用于动态添加新项目

有没有人看到错误,或者我正在尝试做什么特殊类型的 JComboBox?

提前致谢!

【问题讨论】:

    标签: java swing jcombobox


    【解决方案1】:

    因为这行:

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

    Arrays.asList 返回一个不可变列表,您不能向其中添加元素。

    你可以像这样创建一个可变列表:

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

    【讨论】:

    • 多么愚蠢的错误.. 这让我发疯了。谢谢先生,现在一切正常!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2011-11-15
    相关资源
    最近更新 更多