Reputation: 189
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
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
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