пользовательская верхняя метка JComboBox - PullRequest
3 голосов
/ 27 июля 2010

Надеюсь, простой вопрос.

Из примера на http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/components/combobox.html в разделе «Предоставление пользовательского средства визуализации» я могу создать JComboBox, например

Picture 3 - Text 3
-------------------
Picture 1 - Text 1
Picture 2 - Text 2
Picture 3 - Text 3
Picture 4 - Text 4
Picture 5 - Text 5

Где Picture 3 - Text 3 является текущим выбранным элементом.

Возможно ли иметь собственную метку?Например,

Text 3
-------------------
Picture 1 - Text 1
Picture 2 - Text 2
Picture 3 - Text 3
Picture 4 - Text 4
Picture 5 - Text 5

Если изображение не отображается, когда поле со списком находится в свернутом состоянии.

Я использовал JButton / недекорированный всплывающий JFrame, чтобы эмулировать это раньше, но яинтересно, можно ли это сделать с чистым JComboBox

спасибо

Ответы [ 2 ]

2 голосов
/ 27 июля 2010

Возможно ли иметь собственную метку?Например ...

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

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;

public class ComboBoxItemIcon extends JFrame
{
    public ComboBoxItemIcon()
    {
        Vector model = new Vector();
        model.addElement( new Item(new ImageIcon("copy16.gif"), "copy" ) );
        model.addElement( new Item(new ImageIcon("add16.gif"), "add" ) );
        model.addElement( new Item(new ImageIcon("about16.gif"), "about" ) );

        JComboBox comboBox;

        comboBox = new JComboBox( model );
        comboBox.setRenderer( new ItemRenderer() );
        getContentPane().add(comboBox, BorderLayout.SOUTH );
    }

    class ItemRenderer extends BasicComboBoxRenderer
    {
        public Component getListCellRendererComponent(
            JList list, Object value, int index,
            boolean isSelected, boolean cellHasFocus)
        {
            super.getListCellRendererComponent(list, value, index,
                isSelected, cellHasFocus);

            Item item = (Item)value;

            if (index == -1)
            {
                setText( item.getText() );
                setIcon( null );
            }
            else
            {
                setText( item.getText() );
                setIcon( item.getIcon() );
            }

            return this;
        }
    }

    class Item
    {
        private Icon icon;
        private String text;

        public Item(Icon icon, String text)
        {
            this.icon = icon;
            this.text = text;
        }

        public Icon getIcon()
        {
            return icon;
        }

        public String getText()
        {
            return text;
        }
    }

    public static void main(String[] args)
    {
        JFrame frame = new ComboBoxItemIcon();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
     }

}
1 голос
/ 27 июля 2010

Кажется, что в рендере есть 3 вызова функций, связанных с отображением изображения и текста:

setIcon setText setFont

Я не скомпилировал этот пример, но я попытался бы закомментироватьSetIcon (иконка);из функции getListCellRendererComponent, поскольку это, кажется, отображает изображение для выбранного элемента.

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

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