本文介绍了如何在 JComboBox 的箭头图标附近添加图标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建类似于 Firefox 的 URL 文本框的 JComboBox 控件.有谁知道如何自定义 JComboBox 的文本字段.我想在 JComboBox

I would like to create JComboBox control similar with the URL textbox of Firefox. Does anyone know how to customize the textfield of the JComboBox. I want to add some icons on the ALIGN.HORIZONTAL_RIGHT near the arrow button of the JComboBox

感谢您非常详细的解释.实际上我会结合 DefaultListCellRenderer 并将图标添加到组合框中,如下面的代码

Thanks for your very detail explanation. Actually I will combine DefaultListCellRenderer and add the icon to the combo box like following code

import java.awt.Dimension;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Main extends JFrame {
    public Main() {
        // Create icon "C"
        JButton jb = new JButton("C");
        jb.setMargin(new Insets(0, 0, 0, 0));
        jb.setBounds(245, 2, 18, 18);

        // Create combo box
        String[] languages = new String[]{"Java", "C#", "PHP"};
        JComboBox jc = new JComboBox(languages);
        // jc.setEditable(true);
        jc.add(jb);

        getContentPane().add(jc);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(new Dimension(300, 58));
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        final Main main = new Main();
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                main.setVisible(true);
            }
        });
    }
}

但是当我把 jc.setEditable(true);组合编辑器隐藏了我的图标.我在想另一种方式来模拟火狐真棒吧.你对此有什么想法吗?

But when I put jc.setEditable(true); the combo editor hided my icon. I'm thinking another way to simulate Firefox awesome bar. Do you have any idea for this?

推荐答案

这是演示它的完整示例:

Here is completed example that demonstrate it:

package com.demo.combo.icon;



import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.HashMap;
import java.util.Map;

import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;


public class ShowConboWithIcons extends JFrame {

private static final long serialVersionUID = 1L;

private static final ImageIcon INFO_ICON  = new ImageIcon("info.png");
private static final ImageIcon NONE_ICON  = new ImageIcon("none.png");
public final String NONE_STR = "None";
private final String INFO_STR = "Info";

private JComboBox comboBox;
private JPanel    topPanel;

private String[] str_arr = null;


public ShowConboWithIcons(String[] str_arr) {
    this.str_arr = str_arr;
}


public void createGUI(){

    setMinimumSize(new Dimension(100,100));
    setTitle("Demo");
    setLocation(200, 200);

    topPanel = new JPanel();
    getContentPane().add(topPanel, BorderLayout.CENTER);

    Map<Object, Icon> icons = new HashMap<Object, Icon>();

    icons.put(NONE_STR, NONE_ICON);
    icons.put(INFO_STR, INFO_ICON);

    comboBox = new JComboBox();
    comboBox.setRenderer(new IconListRenderer(icons));
    comboBox.addItem("None");

    for(String val : str_arr){
        comboBox.addItem(val);
    }

    topPanel.add(comboBox);

    super.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            dispose();
        }
    });
}

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {

    UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" );

    String[] str_arr = {"A", "B", "C", "D", "E"};

    ShowConboWithIcons T = new ShowConboWithIcons(str_arr);
    T.createGUI();
    T.setVisible(true);
}


class IconListRenderer extends DefaultListCellRenderer{
    private static final long serialVersionUID = 1L;
    private Map<Object, Icon> icons = null;

    public IconListRenderer(Map<Object, Icon> icons){
        this.icons = icons;
    }

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index,boolean isSelected, boolean cellHasFocus)
    {
        JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

        // Get icon to use for the list item value
        Icon icon = icons.get(value);

        if(!value.toString().equals(NONE_STR)){
            icon = icons.get(INFO_STR);
        }

        // Set icon to display for value
        label.setIcon(icon);
        return label;
    }
}
}

预览:

这篇关于如何在 JComboBox 的箭头图标附近添加图标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 12:30