For some reason the TableCellRenderer won't do the mouse event.
I don't get why. It works on my custom made Table Header, and sometimes you have to click twice, in order for the box to change state. That happens all the time if you change the position of the column (drag-and-drop). sometimes if you wan't to sellect a checkbox, after you click it, it will select it, but direct afterwards, even if you don't click one more time, it will deselect the checkbox (the opposite happens too).
I really don't get all these problems. Please Help.
class CheckBoxCellRendererListener implements ItemListener {
public void itemStateChanged(ItemEvent e) { e.getItem();
Object source = e.getSource();
if (source instanceof AbstractButton == false) return;
boolean checked = e.getStateChange() == ItemEvent.SELECTED;
MyTableCellRenderer CheckBoxCellRenderer = (MyTableCellRenderer)e.getItem();
System.out.println(CheckBoxCellRenderer);
JCheckBox checkBox = (JCheckBox)(e.getSource());
JTable table = (JTable)(checkBox.getParent());
table.setValueAt(new Boolean(checked), CheckBoxCellRenderer.getRow(), CheckBoxCellRenderer.getColumn());
}
}
class MyTableCellRenderer extends JCheckBox implements TableCellRenderer, MouseListener{
JTable table;
//JCheckBox checkBox = new JCheckBox();
protected boolean mousePressed = false;
protected int column;
protected int row;
MyTableCellRenderer(ItemListener itemListener, JTable table){
this.table=table;
this.addItemListener(itemListener);
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if (table != null) {
MyTableCellRenderer tableCellRenderer = (MyTableCellRenderer) table.getCellRenderer(row, column);
tableCellRenderer.addMouseListener(this);
this.setBackground(isSelected? UIManager.getColor("Table.selectionBackground") : UIManager.getColor("Table.background"));
//this.setSelected(Boolean.TRUE.equals(value));
}
setColumn(column);
setRow(row);
return this;
}
protected void setColumn(int column) {
this.column = column;
}
public int getColumn() {
return column;
}
protected void setRow(int column) {
this.row = row;
}
public int getRow() {
return row;
}
protected void handleClickEvent(MouseEvent e) {
if (mousePressed) {
mousePressed=false;
JTableHeader header = (JTableHeader)(e.getSource());
JTable tableView = header.getTable();
TableColumnModel columnModel = tableView.getColumnModel();
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
int column = tableView.convertColumnIndexToModel(viewColumn);
if (viewColumn == this.column && e.getClickCount() > 0 && column != -1) {
this.doClick();
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
boolean active=true;
switch (e.getID()) {
case MouseEvent.MOUSE_CLICKED:
case MouseEvent.MOUSE_PRESSED:
case MouseEvent.MOUSE_RELEASED:
JTable tableView = table;
TableColumnModel columnModel = tableView.getColumnModel();
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
int column = tableView.convertColumnIndexToModel(viewColumn);
Rectangle bounds = tableView.getCellRect(-1, viewColumn, true);
if (e.getX() > bounds.x + 16) {
if (e.getID() == MouseEvent.MOUSE_CLICKED) {
active = false;
}
}else{
active=true;
}
}
if(active){
handleClickEvent(e);
((JTableHeader)e.getSource()).repaint();
}
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
mousePressed = true;
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
}
Edited by: Naco88 on Jun 1, 2010 1:12 PM