You need to read docs about Renderers. For proper use of it.
Next code add custom cell renderer to your column:
TableColumn column = table.getColumnModel().getColumn(1);
column.setCellRenderer(getRenderer());
Example code for getRenderer
method:
private static TableCellRenderer getRenderer() {
return new DefaultTableCellRenderer(){
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
boolean solved = false;
if (value.toString().endsWith("Solved")) {
solved = true;
value = value.toString().replace("Solved", "");
}
Component tableCellRendererComponent = super.getTableCellRendererComponent(table, value,isSelected, hasFocus, row, column);
if (solved) {
tableCellRendererComponent.setBackground(Color.GREEN);
} else {
tableCellRendererComponent.setBackground(table.getBackground());
}
return tableCellRendererComponent;
}
};
}
That method returns DefaultTableCellRenderer. Here in if-else
statement you determine background for cell.
EDIT:
1) Changed getRenderer
method.
2)create your popUp in next way:
pm = new JPopupMenu();
pm.add(one);
pm.add(two);
one.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
if(row != -1)
System.out.println("sfsdf" + row);
}
});
two.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
if(row != -1){
Object valueAt = table.getValueAt(row,1);
table.setValueAt(valueAt+"Solved", row,1);
((DefaultTableModel)table.getModel()).fireTableDataChanged();
}
}
});
because you add Listeners every time you call showPopup
method instead of that you must to add it only once as in my example.
row
field I set as static field.
3) your method showPopup changed:
private static void showPopup(MouseEvent me) throws FontFormatException,
IOException {
// is this event a popup trigger?
if (pm.isPopupTrigger(me)) {
Point p = me.getPoint();
row = table.rowAtPoint(p);
final int col = table.columnAtPoint(p);
// if we've clicked on a row in the second column
if (row != -1 && col == 1) {
final ImageIcon progress = new ImageIcon("images/progress.png");
one.setIcon(progress);
final ImageIcon ok = new ImageIcon("images/ok.png");
two.setIcon(ok);
one.setText("In progress " + row + ".");
two.setText("Solved " + row + ".");
pm.show(table, p.x, p.y);
}
}
}
4) create your table next way table = new JTable(new DefaultTableModel(data, columnNames));
If you change your code as I recomended, when you push Solved in popUp then cell will be with green background.