Custom Renderer cho JComboBox
Mặc định JComboBox dùng DefaultListCellRenderer (kế thừa JLabel) để vẽ từng item. Để tùy chỉnh border, padding, background cho item, tạo class extends DefaultListCellRenderer và override getListCellRendererComponent().
Ví dụ: Thêm padding (EmptyBorder) và background xám cho item
import java.awt.*;
import javax.swing.*;
public class JComboBoxBorderDemo extends JFrame {
public JComboBoxBorderDemo() {
setTitle("JComboBox Item Border Demo");
String[] cities = {"Hyderabad", "Mumbai", "Pune", "Bangalore", "Chennai", "Coimbatore"};
JComboBox<String> combo = new JComboBox<>(cities);
combo.setRenderer(new CustomComboBoxRenderer());
add(combo, BorderLayout.NORTH);
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
// Custom renderer
class CustomComboBoxRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
// Thêm padding 7px cho 4 phía
label.setBorder(BorderFactory.createEmptyBorder(7, 7, 7, 7));
label.setBackground(Color.LIGHT_GRAY);
label.setOpaque(true); // cần opaque để background hiển thị
return label;
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(JComboBoxBorderDemo::new);
}
}
Kết quả

Lưu ý: Renderer chỉ ảnh hưởng hiển thị item trong dropdown list. Để tùy chỉnh editor (ô text khi editable), dùng setEditor().