第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);
}
}
}