Add action listener to table cell

The topic of my previous thread was:

How can I get characters, which user inputs into table cell?

I've added lisateners to table:

table.addKeyListener(new java.awt.event.KeyAdapter(){

publicvoid keyPressed(java.awt.event.KeyEvent evt){

System.out.println("keyPressed");

}

publicvoid keyReleased(java.awt.event.KeyEvent evt){

System.out.println("keyReleased");

}

publicvoid keyTyped(java.awt.event.KeyEvent evt){

System.out.println("keyTyped");

}

});

But it's not exactly what I need.

I need to do the same, but with table cell.

I want to see user input char by char and set color font for user input string.

How can I add action listener to tble cell?

[1281 byte] By [Holoda] at [2007-11-27 9:12:05]
# 1
table cell editor .... http://java.sun.com/docs/books/tutorial/uiswing/components/table.htmlregardsAniruddha
Aniruddha-Herea at 2007-7-12 21:58:16 > top of Java-index,Desktop,Core GUI APIs...
# 2

I've read tutorial.

Please, see my code.

I don't get any errors, but nothng happens....

Where is mistake?

//my class fields:

private DefaultTableModel model;

private DefaultTableCellRenderer defaultTCR;

//...

//bla-bla-bla

//...

//creating new DefaultTableCellRenderer

defaultTCR = new DefaultTableCellRenderer();

//adding KeyListener

defaultTCR.addKeyListener( new java.awt.event.KeyAdapter(){

public void keyPressed(java.awt.event.KeyEvent evt){

System.out.println("keyPressed");

}

public void keyReleased(java.awt.event.KeyEvent evt){

System.out.println("keyReleased");

}

public void keyTyped(java.awt.event.KeyEvent evt) {

System.out.println("keyTyped");

}

});

//Creating model

model= new DefaultTableModel(vectorWord,columnNamesUserVector);

model.addTableModelListener(this);

table = new JTable(model)

{

// overriding method

public TableCellRenderer getCellRenderer(int row, int column) {

//I need it only for columns #1 and 3!

if (column == 1 || column==3 ) {

return defaultTCR;

}

else

return super.getCellRenderer(row, column);

}

Holoda at 2007-7-12 21:58:16 > top of Java-index,Desktop,Core GUI APIs...
# 3

Oh....It's cellRenderer... I do not need it.

Eah!!!

I did it!!!

The solution:

***scan user input on columns 1 and 3

JTextField textField = new JTextField();

textField.addKeyListener(new java.awt.event.KeyAdapter(){

public void keyPressed(java.awt.event.KeyEvent evt){

System.out.println("keyPressed");

}

public void keyReleased(java.awt.event.KeyEvent evt){

System.out.println("keyReleased");

}

public void keyTyped(java.awt.event.KeyEvent evt) {

System.out.println("keyTyped");

}

});

table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(textField));

table.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(textField));

Thank you!!!

It was so easy!

Holoda at 2007-7-12 21:58:16 > top of Java-index,Desktop,Core GUI APIs...
# 4

This is my newly created JTextField which I will use as CellEditor for My JTable

JTextField textField = new JTextField(); //creating Component

textField.addKeyListener(new java.awt.event.KeyAdapter(){ //adding KeyListener

public void keyReleased(java.awt.event.KeyEvent evt){

System.out.println("keyReleased" + ((JTextField)evt.getSource()).getText() + "column = " +table.getSelectedColumn());//test functionality

if ( isColumnHasSameValue(table.getSelectedRow(),table.getSelectedColumn(), ((JTextField)evt.getSource()).getText() ) ){//test column for equal values

((JTextField)evt.getSource()).setForeground(Color.RED); //if there is equal value set Color.RED for JTextField text

}

else{ //else set Color.BLACK

((JTextField)evt.getSource()).setForeground(Color.BLACK);

}

}

});

table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(textField)); //set custom CellEditor

private boolean isColumnHasSameValue(int row, int column, String testVal){

testVal = testVal.trim().toLowerCase(); //put away UpperCase and empty spaces

for(int i=0;i<model.getRowCount();i++){

if(i == row){

continue;//skip selected row where user inputs text

}

if(model.getValueAt(i,column).toString().trim().toLowerCase().startsWith(testVal)){

return true; //if test passed

}

}

return false; //if there are no mathes

}

I have a question:

It seems to me, I did not use optimal solution for JTable values testing.

What can ty else?

Maybe, It is better to use

tableModel.getDataVector();

And then use Pattern and Matcher ?

Am I right?>

Holoda at 2007-7-12 21:58:16 > top of Java-index,Desktop,Core GUI APIs...