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
# 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 >

# 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 >

# 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 >

