Java - Add Combobox with Images to JTable

How to Add Combobox With Icons to a JTable Cell In Java Netbeans

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:

Java - Add Combobox with Images to JTable






Share this

Related Posts

Latest
Previous
Next Post »