How to Add Combobox With Icons to a JTable Cell In Java Netbeans
In this Java Tutorial we will see How To Create a JTable with customized JComboBox cells, where the JComboBox items are rendered with images based on the job type.
The user can interact with the JComboBox cells to select a job type from the provided options. In Java Using Netbeans.
What We Are Gonna Use In This Project:
- Java Programming Language.- NetBeans Editor.
Project Source Code:
package new_tutorials;
import java.awt.Component;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.AbstractCellEditor;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
/**
*
* @author 1BestCsharp
*/
public class JTableComboboxWithImages extends JFrame{
public JTableComboboxWithImages(){
setTitle("JTable Combobox Cell WithImages");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600,400);
setLocationRelativeTo(null);
initializeUI();
}
private void initializeUI(){
JTable table = new JTable(new CustomTableModel());
table.setRowHeight(50);
table.getColumnModel().getColumn(2).setCellRenderer(new ComboboxCellRenderer());
table.getColumnModel().getColumn(2).setCellEditor(new ComboboxCellEditor());
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
}
public static void main(String[] args) {
JTableComboboxWithImages frame = new JTableComboboxWithImages();
frame.setVisible(true);
}
// Method to get an array of job options
public String[] getJobList(){
return new String[]{"Designer","Manager","Analyst","Developer"};
}
// Custom cell renderer for the JComboBox items (JobComboBoxRenderer)
private class JobComboBoxRenderer extends DefaultListCellRenderer{
// Override method to customize the rendering of JComboBox items
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean hasFocus){
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, hasFocus);
// Set icon based on the job type
if(value instanceof String text){
label.setText(text);
if("Designer".equals(value)){
label.setIcon(new ImageIcon(getClass().getResource("images/designer.png")));
}
else if("Developer".equals(value)){
label.setIcon(new ImageIcon(getClass().getResource("images/developer.png")));
}
else if("Manager".equals(value)){
label.setIcon(new ImageIcon(getClass().getResource("images/manager.png")));
}
else if("Analyst".equals(value)){
label.setIcon(new ImageIcon(getClass().getResource("images/analyst.png")));
}
}
return label;
}
}
// Custom cell editor for the JComboBox in the "Job" column
private class ComboboxCellEditor extends AbstractCellEditor implements TableCellEditor{
private final JComboBox<String> comboBox;
public ComboboxCellEditor(){
// Create and configure the JComboBox
comboBox = new JComboBox<>(getJobList());
comboBox.setRenderer(new JobComboBoxRenderer());
// Add a focus listener to open the JComboBox when focused
comboBox.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e){
if(e.getComponent() instanceof JComboBox){
((JComboBox<?>) e.getComponent()).showPopup();
}
}
});
}
// Override method to get the edited cell value
@Override
public Object getCellEditorValue() { return comboBox.getSelectedItem(); }
// Override method to get the editor component for a cell
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
comboBox.setSelectedItem(value);
return comboBox;
}
}
// Custom cell renderer for the JComboBox in the "Job" column
private class ComboboxCellRenderer extends DefaultTableCellRenderer{
private final JComboBox<String> comboBox;
public ComboboxCellRenderer(){
comboBox = new JComboBox<>(getJobList());
comboBox.setRenderer(new JobComboBoxRenderer());
}
// Override method to get the renderer component for a cell
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
comboBox.setSelectedItem(value);
return comboBox;
}
}
// Custom table model for the JTable
private class CustomTableModel extends AbstractTableModel{
private final String[] columnNames = {"Name", "Age", "Job"};
private final Object[][] data = {
{"John", 30, "Developer"},
{"Jane", 25, "Designer"},
{"Michael", 35, "Manager"},
{"Emily", 28, "Developer"},
{"Robert", 42, "Analyst"}
};
@Override
public int getRowCount() { return data.length; }
@Override
public int getColumnCount() { return columnNames.length; }
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return data[rowIndex][columnIndex];
}
@Override
public String getColumnName(int columnIndex){
return columnNames[columnIndex];
}
@Override
public Class<?> getColumnClass(int columnIndex){
return columnIndex == 2 ? String.class : Object.class;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex){ return columnIndex == 2; }
@Override
public void setValueAt(Object value, int rowIndex, int columnIndex){
data[rowIndex][columnIndex] = value;
fireTableCellUpdated(rowIndex, columnIndex);
}
}
}
The Final Result:
More Java Projects:
Download Projects Source Code

