Yousuf Soomro
Yousuf Soomro

Reputation: 189

Change background color of JTable Cell clicked

I've two questions

1.I want to change color of a Cell of JTable on mouse click. I've added a listener, like toggle between two colors, if currently it is green, it should turn to blow on other click

String[][] data = new String[rows][columns];
DefaultTableModel model = new DefaultTableModel(data, header);
JTable table = new JTable(model);
table.addMouseListener(new CellClickListener());

// Using following MouseListener

public class CellClickListener extends MouseAdapter{
  public void mouseClicked(MouseEvent e) {
    JTable target = (JTable)e.getSource();
    int row = target.getSelectedRow();
    int column = target.getSelectedColumn();
    // How to getCell object here and change its background color to clicked cell
  }
}

2.How can I set different column width, like firstColumn.setWidth(20), secondColumn.setWidth(40). I've already disabled auto resize table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

Upvotes: 1

Views: 3667

Answers (2)

Reck
Reck

Reputation: 1436

I have been working on the same issue for some days. I have developed a general function

setColorAtCell(Jtable table,Color colr,int row,int column)

which could do things in much better way.

Here is the code which is working for the above question You can also checkout the code from my github

import java.awt.Color;

import java.awt.Component;

import javax.swing.JOptionPane;

import javax.swing.JTable;

import javax.swing.table.DefaultTableCellRenderer;



public class ChangeCellColorJTable extends javax.swing.JFrame {

    public static Color[][] table_color = new Color[40][40];
    //this array is used to change the table color

    public static Object[][] table_value = new Object[40][40];
    //this array is used to change the table values

    public ChangeCellColorJTable() {
        initComponents();
        initTable();                    //Initializing the table
        refreshtable(mytable,1,1);      
    }

    public static void initTable(){
        int i,j;
        Object[][] data = new Object[][]{
                {10,10},
                {11,11},
                {12,12},
                {13,13}
        };
        for(i = 0;i < 4;i++ ){
            for(j = 0;j<2;j++){             
                mytable.setValueAt(data[i][j], i, j);   //Setting values in Jtable    
                table_value[i][j] = data[i][j];         //Setting same values table array 
            }
        }
        for(i = 0;i<4;i++){
            for(j = 0;j<2;j++){
                table_color[i][j] = Color.getColor("#f9f4bd");  //Setting initial color of the table
                                                                //Not Mandatory
            }
        }
    }
    private void initComponents() {         //These code is to initialize the Components to be Displayed
        jScrollPane1 = new javax.swing.JScrollPane();
        mytable = new javax.swing.JTable();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        mytable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null},
                {null, null},
                {null, null},
                {null, null}
            },
            new String [] {
                "Title 1", "Title 2"
            }
        ));
        mytable.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                mytableMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(mytable);
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(13, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(13, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
       pack();
    }
    //MouseClicked on Table Event
    private void mytableMouseClicked(java.awt.event.MouseEvent evt) {           //MouseClickEvent                             
        int row,column;
        Color colr = Color.CYAN;
        JTable target = (JTable)evt.getSource();
        row = target.getSelectedRow();
        column = target.getSelectedColumn();
        setColorAtCell(mytable,colr,row,column);        
    }           

    //referesh table function by call custom_renderer
    public static void refreshtable(JTable table,int row,int column){
        int i;
        try{
            mytable.getColumnModel().getColumn(column).setCellRenderer(new Custom_Renderer());
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, "error there");
        }
    }
    //this function could be used for changing the color at specific cell
    //Provided we use a Table Color Array (table_color)
    public static void setColorAtCell(JTable table,Color colr,int row,int column){
        table_color[row][column] = colr;
        refreshtable(table,row,column);
        refreshtable(table,row,column);
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ChangeCellColorJTable().setVisible(true);
            }
        });
    }

    private javax.swing.JScrollPane jScrollPane1;
    public static javax.swing.JTable mytable;               
}


class Custom_Renderer extends DefaultTableCellRenderer 
{
    Custom_Renderer(){

    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        Object value_present = table.getValueAt(row, column);
        Object value_in_table = ChangeCellColorJTable.table_value[row][column];
        if(value_present.equals(value_in_table)){           //This condition I used so that the Specific cell come into the condition
            Color color = ChangeCellColorJTable.table_color[row][column];
            cellComponent.setBackground(color);
        }else{
            cellComponent.setBackground(Color.blue);
        }
        return cellComponent;
    }
}

Upvotes: 1

Gabriel C&#226;mara
Gabriel C&#226;mara

Reputation: 1249

You have to create your own CellRenderer and also use a MouseAdapter Here's an SSCCE to elucidate what I mean: Hope it helps =)

public class JTableTest extends JFrame {

    private JPanel      contentPane;
    private JScrollPane scrollPane;
    private JTable      table;
    private int         col;
    private int         rowz;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    teste frame = new teste();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public JTableTest() {
        initComponents();
    }

    private void initComponents() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        scrollPane = new JScrollPane();
        contentPane.add(scrollPane, BorderLayout.CENTER);

        table = new JTable();
        table.setModel(new DefaultTableModel(new Object[][] { { "", null, null, "" }, { null, null, null, null }, { null, null, null, "" },
                        { null, null, null, null }, }, new String[] { "Column 0", "Column 1", "Column 2", "Column 3" }));
        table.getColumnModel().getColumn(0).setMinWidth(200); // Here's how to
                                                                // change a
                                                                // column width
        scrollPane.setViewportView(table);
        table.setDefaultRenderer(Object.class, new CustomModel());
        table.addMouseListener(new CustomListener());
    }

    public class CustomListener extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent arg0) {
            super.mouseClicked(arg0);
            // Select the current cell
            rowz = table.getSelectedRow();
            col = table.getSelectedColumn();

            // Repaints JTable
            table.repaint();
        }
    }

    public class CustomModel extends DefaultTableCellRenderer {

        /**
         * 
         */
        private static final long   serialVersionUID    = 1L;

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            Color c = Color.WHITE;
            if (isSelected && row == rowz & column == col)
                c = Color.GREEN;
            label.setBackground(c);
            return label;
        }
    }

}

Upvotes: 2

Related Questions