View Full Version : [JAVA] Jtable come fare la prima colonna colorata
federico100mt
05-03-2009, 13:52
Ciao, sono un po di giorni che mi metto su questo punto del codice ma non riesco a capire come si puo fare ad ottenere la prima colonna di sinistra nello stesso modo degli header delle colonne, quindi in grigio e non editabili.. tipo
String[] columnNames = { "a", "b", "c" };
nel mio caso ho nell prima colonna questi valori:
Object[][] dataShift;
dataShift[i][0] = i+1;
vorrei renderli quindi come quelli degli header.
Queste jtable... sono complicatuccie direi :(
federico100mt
06-03-2009, 09:54
nessuno riesce a darmi uno spunto???
tipo un sistema piu semplice per ottenere almeno una cosa simile... :stordita:
Incollo un esempio commentato.
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class Main {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new FrameManager().show();
}
});
}
}
class FrameManager {
private JFrame frame;
FrameManager() {
frame = new JFrame("Table Test");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JTable table = new CustomTable(8, 8);
JScrollPane scroller = new JScrollPane(table);
frame.add(scroller, BorderLayout.CENTER);
}
void show() {
frame.pack();
frame.setVisible(true);
}
}
class CustomTable extends JTable {
/* Istanza del particolare renderer che colora lo sfondo di una cella in modo
diverso dal normale. Questa istanza sarà restituita, a certe condizioni, nel
metodo getCellRenderer(int, int). */
private TableCellRenderer customRenderer = new CustomRenderer();
CustomTable(int rowCount, int colCount) {
super(rowCount, colCount);
}
/** Ridefinisco il metodo usato da swing per determinare se una cella in una
tabella sia o meno "modificabile". La mia definizione dice che se la cella si
trova nella colonna zero allora la cella stessa non deve poter essere modificata.
Se la cella sta su un'altra colonna allora lascio la decisione alla definizione
standard (super.isCellEditable) di questo metodo. */
public boolean isCellEditable(int row, int column) {
if(column == 0) {
return false;
} else {
return super.isCellEditable(row, column);
}
}
/** Ridefinisco il metodo getCellRenderer di questo tipo di JTable in modo
che restituisca per la prima colonna non il renderer standard ma un
particolare tipo di renderer, CustomRenderer, che mostrerà il contenuto della
cella secondo parametri particolari (nel nostro caso con un certo colore di
sfondo */
public TableCellRenderer getCellRenderer(int row, int column) {
/* row e column sono le "coordinate" della cella per le quali è richiesto
il renderer.*/
/* se la cella è una di quelle che si trova nella prima colonna... */
if(column == 0) {
/* allora il renderer che swing dovrà usare è il mio, quello che
colora lo sfondo della cella come dico io */
return customRenderer;
} else {
/* altrimenti va bene il renderer predefinito */
return super.getCellRenderer(row, column);
}
}
}
class CustomRenderer extends DefaultTableCellRenderer {
/* metodo usato dal sistema di disegno delle tabelle per definire l'aspetto grafico di ciò che
quella cella contiene. Restituisce un Component ma è bene ricordare che il Component restituito non
è soggetto alle normali regole di layout e interazione. In pratica il component restituito è usato
solo per disegnare "value". */
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component predefinedComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Color headerBackground = table.getTableHeader().getBackground();
predefinedComponent.setBackground(headerBackground);
return predefinedComponent;
}
}
Questo risolve il problema del colore e dell'insensibilità all'interazione di certe celle.
federico100mt
06-03-2009, 13:49
grazie mille!
federico100mt
09-03-2009, 10:36
Buon giorno,
in seguito a questa modifica apportata, andata praticamente a buon fine, non riesco a far si che il contenuto nelle celle della prima colonna di cui ho cambiato, sia di interi allineati a destra, ora mi da tutti double allineati a sinistra perche?
come posso dirgli, alla colonna, voglio solo interi allineati a destra?
grazie...
Una tabella swing "normale" sceglie un renderer ad hoc se le colonne hanno valori tipici (i predefiniti sono stringhe, numeri, boolean). La scelta si basa sulla classe degli oggetti contenuti nella colonna.
Il nostro codice bypassa quella scelta.
Ci sono più soluzioni, io ritengo che la più opportuna passi per la definizione completa di un renderer - anzichè un parziale riciclaggio del renderer DefaultTableCellRenderer.
La faccenda ha una soluzione relativamente rapida. Ad esempio:
final class CustomRenderer extends JLabel implements TableCellRenderer {
CustomRenderer() {
setOpaque(true);
/* il testo è mostrato da questa etichetta - e, quindi, il testo mostrato
dalle celle che usano questo TableCellRenderer come proiettore del contenuto -
è sempre allineato a destra */
setHorizontalAlignment(JLabel.RIGHT);
}
/* metodo usato dal sistema di disegno delle tabelle per definire l'aspetto grafico di ciò che
quella cella contiene. Restituisce un Component ma è bene ricordare che il Component restituito non
è soggetto alle normali regole di layout e interazione. In pratica il component restituito è usato
solo per disegnare "value". */
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
/* determina il testo da mostrare su questa etichetta. Se il valore della cella è un numero usa il valore
intero di quel numero, altrimenti converte il valore in stringa. */
String text;
if(value instanceof Number) {
Number n = (Number)value;
text = String.valueOf(n.longValue());
} else {
text = String.valueOf(value);
}
/* imposta il testo su determinato come testo di questa etichetta - e, quindi, come valore mostrato dalla
tabella nella cella di cui questo TableCellRenderer è proiettore. */
setText(text);
/* Lo sfondo della cella è sempre del colore di sfondo dell'intestazione della tabella. */
Color headerBackground = table.getTableHeader().getBackground();
return this;
}
}
federico100mt
09-03-2009, 14:00
sto imparando a manetta, ti ringrazio, ma quest jtable sbaglio o sono rognose?
La questione è un po' più sottile dell'essere o meno rognosi :D.
A parità di prospettiva l'uso di una tabella è complesso quanto l'uso di un'etichetta.
Considera come usi una JLabel: prendi un'informazione fatta di più parti (una stringa è fatta di tanti caratteri), la consideri atomicamente, la piazzi nell'etichetta e via.
Una tabella funziona allo stesso modo: prendi un'informazione complessa (una griglia di dati), la consideri atomicamente, la piazzi nella tabella e via.
L'attività cambia quando l'informazione complessa non è più considerata come un "pacchetto unitario": se consideri i dati della tabella come divisi in due parti, allora è necessaria una bipartizione dell'attività svolta dalla tabella.
Per intenderci, quanto sarebbe "semplice" una JLabel se volessimo rappresentare un sottoinsieme dei caratteri della stringa in modo diverso dagli altri?
Dunque io direi no, le tabelle non sono più rognose di un qualsiasi altro componente swing.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.