Un errore tuo e un errore mio.
Errore tuo: stai applicando il bordo alla tabella ( this.setBorder(...) ) e non al rendererComponent.
Errore mio: il rendererComponent deve essere un JComponent (basta un cast, visto che lo è) altrimenti non si può chiamare setBorder(), dato che Component non prevede tale metodo.
Un esempio:
codice:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
public class BordiTabella extends JFrame {
private class Tabella extends JTable {
private boolean[] jump;
public Tabella(TableModel model) {
super( model );
}
public void setJump(boolean[] jump) {
this.jump = jump;
}
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
JComponent rendererComponent = (JComponent) super.prepareRenderer(renderer, row, column);
// Di default sarà senza bordo
rendererComponent.setBorder( null );
// Se la condizione è verificata, coloro la riga di rosso
if ( jump[row] ) {
rendererComponent.setBorder( BorderFactory.createMatteBorder(0,0,3,0,Color.BLACK) );
}
return rendererComponent;
}
}
private Tabella tabella;
private String[][] data = {
{"Data1", "Data2", "Data3"},
{"Data1", "Data2", "Data3"},
{"Data1", "Data2", "Data3"},
{"Data1", "Data2", "Data3"},
{"Data1", "Data2", "Data3"},
{"Data1", "Data2", "Data3"}
};
private String[] columnNames = {"Nome1", "Nome2", "Nome3"};
public BordiTabella() {
Container c = getContentPane();
c.setLayout( new BorderLayout() );
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames);
tabella = new Tabella( tableModel );
tabella.setJump( new boolean[]{false, false, true, false, true, false} );
JScrollPane jsp = new JScrollPane( tabella );
c.add(jsp, BorderLayout.CENTER);
setTitle("Tabella con bordi");
setSize(800, 600);
setLocationRelativeTo( null );
setDefaultCloseOperation( EXIT_ON_CLOSE );
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
new BordiTabella().setVisible( true );
}
});
}
}
Ho notato, inoltre, che viene fatto un test su tipo.equalsIgnoreCase("TG")... il parametro "tipo" viene passato alla creazione della tabella e non cambia per tutta la durata della sua esistenza (non essendovi metodi che lo permettano)... ora, non so se così sia corretto (dal punto di vista logico)... io mi sarei aspettato che il controllo fosse fatto sul dato presente sulla singola riga, non su un dato fisso per tutta la tabella...
Ciao.