Nonostante le ricerche nel web non sono riuscito a capire come fare ad inserire in una colonna della JTabel i flag booleani!!!
Ho bisogno di un esempio sul mio codice, che vi spiego e posto di seguito.
Nel codice richiamo più volte la costruzione di tabelle JTable e per questo ho creato la classe Tables che a seconda dei parametri passati al costruttore restituisce la tabella del caso.
Invoco la costruzione della tabella:
codice:
JTable tablePagato = new Tables(numeroBolletta).drawTable();
panUP.add(new JScrollPane(tablePagato));
Di seguito la classe Tables con il costruttore che ci interessa in questo caso, invocato con il passaggio del parametro di tipo int:
codice:
package tabelle;
import java.awt.Dimension;
import javax.swing.JRadioButton;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import calcoliBolletta.CalcoliBolletta;
import database.Condomini;
import database.Millesimi;
import utility.Arrotondamenti;
import utility.Decimali;
import utility.LeggiDataPagato;
import utility.LeggiPagato;
public class Tables {
final DefaultTableModel model = new DefaultTableModel();
private JTable table = new JTable(model);
private String[] condomino = Condomini.getElencoCognome();
private int numRow;
private Object[][] datiColonna;
private Object[] lastRow;
private Object[] columnHeaders;
private int[] misureColonne;
private int dimX;
private int dimY;
private String evidenziaRow = null;
private String coloreRow = null;
[.....]
// OPERAZIONI AGGIUNTIVE: PAGATO SI/NO
public Tables(int numeroBolletta) {
String pagato = new LeggiPagato().leggi(numeroBolletta);
String dataPagato = new LeggiDataPagato().leggi(numeroBolletta);
columnHeaders = new Object[] {"PAGATO","CHECK",};
numRow = 2;
datiColonna = new String[columnHeaders.length][numRow];
// PRIMA colonna 0
datiColonna[0][0] = "SI";
datiColonna[0][1] = "NO";
// SECONDA colonna 1
datiColonna[1][0] = pagato;
datiColonna[1][1] = pagato;
lastRow = new Object[] {"DATA:",dataPagato};
misureColonne = new int[] {80,80};
dimX = 160;
dimY = 48;
draw();
} // FINE METODO
[.....]
public void draw() {
table.setPreferredScrollableViewportSize(new Dimension(dimX,dimY));
table.setFillsViewportHeight(true);
table.setColumnSelectionAllowed(false);
table.getTableHeader().setReorderingAllowed(false); // SPOSTAMENTO DELLE COLONNE
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setAutoResizeMode(0); //AUTO RESIZE OFF
table.setEnabled(false);
TableColumn colonna = null;
// DATI JTABLE
for(int i=0; i<columnHeaders.length; i++) {
model.addColumn("<html>"+columnHeaders[i]+"</html>", datiColonna[i]);
}
for(int i=0; i<numRow; i++) {
for(int x=0; x<model.getColumnCount(); x++) {
table.getColumnModel().getColumn(x).setCellRenderer(new TableModel(numRow,evidenziaRow,coloreRow));// SETUP TABELLA
}
}
model.addRow(lastRow); // ULTIMA RIGA
//SETUP delle COLONNE
for(int i=0; i<columnHeaders.length; i++) {
// IMPOSTAZIONI COLONNE
colonna = table.getColumnModel().getColumn(i);
colonna.setResizable(false);
colonna.setPreferredWidth(misureColonne[i]);
}
} // FINE METODO
public JTable drawTable() {
return table;
} // FINE METODO
} // FINE CLASSE
Poi ho la classe TableModel, dove a secondo dei valori o meno che assegno ad alcune variabili nei costruttori della classe Table, ottengo la formattazione delle tabelle, come colore di backgroung delle righe, colore testo etc...
codice:
package tabelle;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
public class TableModel extends DefaultTableCellRenderer {
/**
*
*/
private static final long serialVersionUID = 1L;
private String[] checkRed;
private int lastRow;
private String evidenziaRow,coloreRow;
public TableModel(String[] checkRed) {
this.checkRed = checkRed;
}
public TableModel(int lastRow, String evidenziaRow, String coloreRow) {
this.checkRed = null;
this.lastRow = lastRow;
this.evidenziaRow = evidenziaRow;
this.coloreRow = coloreRow;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setOpaque(true);
label.setHorizontalAlignment(SwingConstants.CENTER);
// COLORE ALTERNATO RIGHE
if (row%2 == 0) {
label.setBackground(Color.WHITE);
} else {
label.setBackground(new Color(232,242,254));
}
// SFONDO DIVERSO PER LE TABLE CHE NON CHIAMANO IL CHECK (CIOE' DIVERSE DAL RegistroCassa)
if (checkRed == null) {
if (row == lastRow) label.setBackground(new Color(173,255,47));
if (evidenziaRow != null) { // evidenzia la riga del condomino nella table millesimi!!!
if (row == Integer.parseInt(evidenziaRow)-1) label.setBackground(new Color(250,150,0));
}
if (coloreRow != null) { // colora le righe delle tabelle AGGIUNTE/DETRAZIONI
if (coloreRow.equals("DETRAZIONI")) {label.setForeground(Color.RED); }
else { label.setForeground(Color.BLUE); }
}
}
// SCRITTA ROSSA PER LE VOCI OUT se richiamata nel costruttore
if (checkRed != null) {
if (Boolean.parseBoolean(checkRed[row])) {
label.setForeground(Color.RED);
} else {
label.setForeground(Color.BLUE);
}
}
// COLORE RIGA SELEZIONATA
if (isSelected) label.setBackground(Color.LIGHT_GRAY);
return label;
}
}
Volendo realizzare la semplice tabella come nel codice sopra postato della classe Tables, con sole due colonne e tre righe, dove al fianco delle celle con la scritta SI e NO, a secondo del valore della variabile "pagato" (Si/NO oppure TRUE/FALSE) mi appaia il flag booleano spuntato o meno, come posso fare!?
Grazie a Tutti per l'attenzione