Following example shows JCombo with a custom renderer having items with icons.
public class JComboBoxExample {
public static void main(String[] args) {
List<Employee> employees = EmployeeDataAccess.getEmployees();
JComboBox<Employee> comboBox = new JComboBox<>(employees.toArray(new Employee[employees.size()]));
//renderer
comboBox.setRenderer(new ExampleRenderer());
//wrap in a panel
JPanel panel = new JPanel();
panel.add(comboBox);
//frame
JFrame frame = createFrame();
frame.add(panel);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static JFrame createFrame() {
JFrame frame = new JFrame("JComboBox Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(600, 300));
return frame;
}
}
public class ExampleRenderer extends DefaultListCellRenderer {
private Map<String, ImageIcon> iconMap = new HashMap<>();
private Color background = new Color(0, 100, 255, 15);
private Color defaultBackground = (Color) UIManager.get("List.background");
public ExampleRenderer() {
iconMap.put("Account", new ImageIcon(getClass().getResource("/images/account.png")));
iconMap.put("Sales", new ImageIcon(getClass().getResource("/images/sales.png")));
iconMap.put("IT", new ImageIcon(getClass().getResource("/images/it.png")));
iconMap.put("Admin", new ImageIcon(getClass().getResource("/images/admin.png")));
}
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
Employee emp = (Employee) value;
this.setText(emp.getName());
this.setIcon(iconMap.get(emp.getDept()));
if (!isSelected) {
this.setBackground(index % 2 == 0 ? background : defaultBackground);
}
return this;
}
}
The four icons loaded in above code is already in the folder src/main/resources/images/.
public class EmployeeDataAccess {
public static List<Employee> getEmployees() {
List<Employee> list = new ArrayList<>();
String[] depts = {"IT", "Account", "Admin", "Sales"};
DataFactory df = new DataFactory();
for (int i = 1; i <= 30; i++) {
Employee e = new Employee();
e.setName(df.getName());
e.setAddress(df.getAddress() + ", " + df.getCity());
e.setDept(df.getItem(depts));
e.setPhone(df.getNumberText(3) + "-" + df.getNumberText(3) +
"-" + df.getNumberText(4));
list.add(e);
}
return list;
}
}
public class Employee {
private String name;
private String dept;
private String phone;
private String address;
.............
}
Output
Example ProjectDependencies and Technologies Used: - datafactory 0.8: Library to generate data for testing.
- JDK 1.8
- Maven 3.3.9
|