У меня есть 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 для того, что я пытаюсь сделать?
Заранее спасибо!