JAVA GUI 中下拉列表框中怎么添加图片

如题所述

第1个回答  2017-01-07

// 可把代码编译运行
/**
 * 注意标有“重点”两字的注释
 */
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Transparency;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;

/**
 *
 * @author beans
 */
public class TestComboBox {

    public static void main(String[] args) {
        new TestComboBox().showDialog();
    }

    /**
     * 显示窗口
     */
    private void showDialog() {
        JDialog dialog = new JDialog();

        dialog.setBounds(new Rectangle(50, 50, 380, 350));
        dialog.setTitle("组合框");

        dialog.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                dialog.setVisible(false);
                dialog.dispose();
            }
        });

        dialog.add(this.getPanel(), BorderLayout.CENTER);
        dialog.setVisible(true);
    }
    private javax.swing.JComboBox<String> comboBox;

    private JPanel getPanel() {
        JPanel panel = new JPanel();
        comboBox = new javax.swing.JComboBox<>();
        comboBox.setModel(new javax.swing.DefaultComboBoxModel<>(new String[]{"Item 1", "Item 2", "Item 3", "Item 4"}));
        
        /**
         * 重点:设置节点渲染器
         */
        comboBox.setRenderer(new NodeRenderer());
        
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(panel);
        panel.setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                        .addGap(72, 72, 72)
                        .addComponent(comboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 119, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(209, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                        .addGap(52, 52, 52)
                        .addComponent(comboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(227, Short.MAX_VALUE))
        );
        return panel;
    }

    /**
     * 重点:节点渲染器
     */
    protected class NodeRenderer extends JLabel implements ListCellRenderer {

        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean selected, boolean cellHasFocus) {
            this.setIcon(this.getIcon(selected));
            this.setText("  " + value + " ");
            return this;
        }

        /**
         * 图标
         *
         * @param isSelect 选中节点时返回不同的图标。
         * @return
         */
        ImageIcon getIcon(boolean isSelect) {
            int wh = 20;
            BufferedImage image = new BufferedImage(wh, wh, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = image.createGraphics();

            image = g2.getDeviceConfiguration().createCompatibleImage(wh, wh, Transparency.TRANSLUCENT);
            Graphics2D g2d = image.createGraphics();
            Font font = new Font("Dialog", Font.PLAIN, wh - 4);
            g2d.setFont(font);
            g2d.setBackground(Color.WHITE);
            g2d.setColor(Color.BLACK);
            g2d.drawString(isSelect ? " S " : " N ", 0, wh - 1);
            g2d.setColor(isSelect ? Color.RED : Color.YELLOW);
            g2d.drawLine(0, 5, wh, 5);
            g2d.drawLine(0, 10, wh, 10);
            g2d.drawLine(0, 15, wh, 15);

            g2d.dispose();
            g2.dispose();
            return new ImageIcon(image);
        }
    }
}