Affichage des articles dont le libellé est Java Swing JTable Tutorial. Afficher tous les articles
Affichage des articles dont le libellé est Java Swing JTable Tutorial. Afficher tous les articles

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