Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-04-2007, 12:16   #1
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
[JAVA] Aggiungere e modificare da una Jtable

Salve,
devo realizzare una matrice di tutte stringhe.

c1 c2 c3 c4 c5
x x x x x
x x x x x
x x x x x

Le prime informazioni che andrò ad inserire sono i primi due campi (c1 e c2) ma ogni volta che mi viene data una nuova informazione io devo aggiungerla. Come faccio ? ovviamente se c1 è la chiave primaria di questa matrice l'informazione che arriva in un secondo tempo mi verrà data assieme alla chiave ...

mi aiutate?
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2007, 12:24   #2
spv42
Member
 
Iscritto dal: Sep 2005
Messaggi: 274
Usa la classe TableModel!
spv42 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2007, 13:16   #3
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
e le ricerche ? i riposizionamenti ? come li faccio ?
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2007, 13:32   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Proviamo a fare un esperimento di programmazione orientata agli oggetti: pieghiamo una tabella al nostro volere .

Come dice spv42, si tratta di creare un modello ad hoc per una tabella. Il fatto che si deva passare per il modello

non c'entra nulla con l'orientamento agli oggetti, ovviamente. Semplicemente le tabelle Swing sono fatte così.

Partiamo dallo scheletro.

Codice:
import javax.swing.table.*;

public class MyTableModel extends AbstractTableModel {

}
La tabella ha cinque colonne.

Codice:
import javax.swing.table.*;

public class MyTableModel extends AbstractTableModel {
	private int numeroDiColonne = 5;

	public int getColumnCount() {
		return numeroDiColonne;
	}
}
Quante righe ha? Non si sa. Però sappiamo che ne avrà. Possiamo usare una lista per rappresentare le righe.

Codice:
import javax.swing.table.*;
import java.util.*;

public class MyTableModel extends AbstractTableModel {
	private LinkedList<String[]> righe = new LinkedList<String[]>();
	private int numeroDiColonne = 5;

	public int getColumnCount() {
		return numeroDiColonne;
	}

	public int getRowCount() {
		return righe.size();
	}
}
Per poter essere utile ad una tabella, un AbstractTableModel deve definire il metodo getValueAt(riga, colonna).

Supponendo che ogni nodo della lista righe contenga un array di 5 componenti String, il nostro getValueAt diventa:

Codice:
import javax.swing.table.*;
import java.util.*;

public class MyTableModel extends AbstractTableModel {
	private LinkedList<String[]> righe = new LinkedList<String[]>();
	private int numeroDiColonne = 5;

	public int getColumnCount() {
		return numeroDiColonne;
	}

	public int getRowCount() {
		return righe.size();
	}

	public Object getValueAt(int indiceRiga, int indiceColonna) {
		String[] riga = righe.get(indiceRiga);
		return riga[indiceColonna];
	}
}
Adesso viene il bello.
Quote:
Le prime informazioni che andrò ad inserire sono i primi due campi (c1 e c2)
E facciamolo:

Codice:
import javax.swing.table.*;
import java.util.*;

public class MyTableModel extends AbstractTableModel {
	private LinkedList<String[]> righe = new LinkedList<String[]>();
	private int numeroDiColonne = 5;

	public int getColumnCount() {
		return numeroDiColonne;
	}

	public int getRowCount() {
		return righe.size();
	}

	public Object getValueAt(int indiceRiga, int indiceColonna) {
		String[] riga = righe.get(indiceRiga);
		return riga[indiceColonna];
	}

	public void aggiungiRiga(String c1, String c2) {
		String[] riga = new String[5];
		riga[0] = c1;
		riga[1] = c2;
		righe.add(riga);
		fireTableRowsInserted(righe.size() - 1, righe.size() - 1);
	}
}
Funziona? Certo che funziona, malfidenti! Proviamo con un Main:

Codice:
import javax.swing.*;
import javax.swing.table.*;

public class Main {
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new Main().start();
			}
		});
	}

	private final MyTableModel tableModel = new MyTableModel();

	private void start() {
		JTable table = new JTable(tableModel);
		JScrollPane scroller = new JScrollPane(table);
		JFrame window = new JFrame("MyTableModel Sample");
		window.add(scroller);
		window.pack();
		window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		window.setVisible(true);
	}
}
Questo mostra una tabella con 5 colonne e nessuna riga. Ma se usiamo il notro metodo aggiungiRiga:

Codice:
import javax.swing.*;
import javax.swing.table.*;

public class Main {
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new Main().start();
			}
		});
	}

	private final MyTableModel tableModel = new MyTableModel();

	private void start() {
		tableModel.aggiungiRiga("1", "Pippo");
		tableModel.aggiungiRiga("2", "Gianni");
		JTable table = new JTable(tableModel);
		JScrollPane scroller = new JScrollPane(table);
		JFrame window = new JFrame("MyTableModel Sample");
		window.add(scroller);
		window.pack();
		window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		window.setVisible(true);
	}
}
Notiamo come effettivamente il comportamento del modello rispecchi le nostre necessità: possiamo aggiungere una riga

specificando i suoi due valori iniziali.

A questo punto c'è un inghippo di intrepretazione.

Quote:
ovviamente se c1 è la chiave primaria di questa matrice l'informazione che arriva in un secondo tempo mi

verrà data assieme alla chiave
Io questo lo vedo così: quando vuoi inserire un dato nella tabella, lo fai attraverso un metodo che richiede il

valore della chiave primaria, il nome della colonna a cui corriponde il valore ed il valore da inserire. Ma qui

occorrerà poi stabilire cosa deve succedere nel caso in cui manchi una riga con quella chiave primaria. Comunque,

restando alla prima parte, potremmo pensare all'introduzione di un metodo di questo genere:

setValore(String chiavePrimaria, String nomeColonna, String valore)

realizzato ad esempio in questo modo:

Codice:
import javax.swing.table.*;
import java.util.*;

public class MyTableModel extends AbstractTableModel {
	private String[] nomiColonne = { "ID", "NOME", "CF", "P.IVA", "TEL" };
	private Map<String, Integer> mappaNomiColonne = new HashMap<String, Integer>();
	private LinkedList<String[]> righe = new LinkedList<String[]>();
	private int numeroDiColonne = 5;

	public MyTableModel() {
		for(int i = 0; i < nomiColonne.length; i++) {
			mappaNomiColonne.put(nomiColonne[i], i);
		}
	}

	public String getColumnName(int column) {
		return nomiColonne[column];
	}

	public int getColumnCount() {
		return numeroDiColonne;
	}

	public int getRowCount() {
		return righe.size();
	}

	public Object getValueAt(int indiceRiga, int indiceColonna) {
		String[] riga = righe.get(indiceRiga);
		return riga[indiceColonna];
	}

	public void aggiungiRiga(String c1, String c2) {
		String[] riga = new String[5];
		riga[0] = c1;
		riga[1] = c2;
		righe.add(riga);
		fireTableRowsInserted(righe.size() - 1, righe.size() - 1);
	}

	public void setValore(String chiavePrimaria, String nomeColonna, String valore) throws Exception {
		int indiceRiga = getIndiceRiga(chiavePrimaria);
		if(indiceRiga < 0) {
			throw new Exception("Manca una riga per la chiave primaria: " + chiavePrimaria);
		}
		String[] riga = righe.get(indiceRiga);
		int indiceColonna = getIndiceColonna(nomeColonna);
		if(indiceColonna < 0) {
			throw new Exception("Manga una colonna di nome: " + nomeColonna);
		}
		riga[indiceColonna] = valore;
		fireTableRowsUpdated(indiceRiga, indiceRiga);
	}

	private int getIndiceRiga(String chiavePrimariaCercata) {
		int indice = -1;
		for(int i = 0; i < righe.size() && indice == -1; i++) {
			String chiavePrimariaRiga = righe.get(i)[0];
			if(chiavePrimariaRiga.equals(chiavePrimariaCercata)) {
				indice = i;
			}
		}
		return indice;
	}

	private int getIndiceColonna(String nomeColonna) {
		Integer indice = mappaNomiColonne.get(nomeColonna);
		return indice != null ? indice : -1;
	}
}
Ometto l'intera classe Main e indico solo un caso d'uso. Supponendo di aver introdotto due righe:

Codice:
tableModel.aggiungiRiga("1", "Pippo");
tableModel.aggiungiRiga("2", "Gianni");
L'inserimento di un valore per la colonna TEL, riga di chiave primaria "2", si produrrebbe con:

Codice:
try {
	tableModel.setValore("2", "TEL", "555-9191");
} catch(Exception ex) {
	ex.printStackTrace();
}
Ci sono poi altre questioni relative all'inserimento di valori tramite l'interazione utente. Quello che qui abbiamo fatto è stato definire un modus operandi "programmatico". Siccome sono andato un po' a naso, prima di vedere il resto aspetto di sapere se quello che ho scritto chiarisce i dubbi che hai sul come procedere.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2007, 16:11   #5
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Proviamo a fare un esperimento di programmazione orientata agli oggetti: pieghiamo una tabella al nostro volere .

Come dice spv42, si tratta di creare un modello ad hoc per una tabella. Il fatto che si deva passare per il modello

non c'entra nulla con l'orientamento agli oggetti, ovviamente. Semplicemente le tabelle Swing sono fatte così.

Partiamo dallo scheletro.

Codice:
import javax.swing.table.*;

public class MyTableModel extends AbstractTableModel {

}
La tabella ha cinque colonne.

Codice:
import javax.swing.table.*;

public class MyTableModel extends AbstractTableModel {
	private int numeroDiColonne = 5;

	public int getColumnCount() {
		return numeroDiColonne;
	}
}
Quante righe ha? Non si sa. Però sappiamo che ne avrà. Possiamo usare una lista per rappresentare le righe.

Codice:
import javax.swing.table.*;
import java.util.*;

public class MyTableModel extends AbstractTableModel {
	private LinkedList<String[]> righe = new LinkedList<String[]>();
	private int numeroDiColonne = 5;

	public int getColumnCount() {
		return numeroDiColonne;
	}

	public int getRowCount() {
		return righe.size();
	}
}
Per poter essere utile ad una tabella, un AbstractTableModel deve definire il metodo getValueAt(riga, colonna).

Supponendo che ogni nodo della lista righe contenga un array di 5 componenti String, il nostro getValueAt diventa:

Codice:
import javax.swing.table.*;
import java.util.*;

public class MyTableModel extends AbstractTableModel {
	private LinkedList<String[]> righe = new LinkedList<String[]>();
	private int numeroDiColonne = 5;

	public int getColumnCount() {
		return numeroDiColonne;
	}

	public int getRowCount() {
		return righe.size();
	}

	public Object getValueAt(int indiceRiga, int indiceColonna) {
		String[] riga = righe.get(indiceRiga);
		return riga[indiceColonna];
	}
}
Adesso viene il bello.

E facciamolo:

Codice:
import javax.swing.table.*;
import java.util.*;

public class MyTableModel extends AbstractTableModel {
	private LinkedList<String[]> righe = new LinkedList<String[]>();
	private int numeroDiColonne = 5;

	public int getColumnCount() {
		return numeroDiColonne;
	}

	public int getRowCount() {
		return righe.size();
	}

	public Object getValueAt(int indiceRiga, int indiceColonna) {
		String[] riga = righe.get(indiceRiga);
		return riga[indiceColonna];
	}

	public void aggiungiRiga(String c1, String c2) {
		String[] riga = new String[5];
		riga[0] = c1;
		riga[1] = c2;
		righe.add(riga);
		fireTableRowsInserted(righe.size() - 1, righe.size() - 1);
	}
}
Funziona? Certo che funziona, malfidenti! Proviamo con un Main:

Codice:
import javax.swing.*;
import javax.swing.table.*;

public class Main {
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new Main().start();
			}
		});
	}

	private final MyTableModel tableModel = new MyTableModel();

	private void start() {
		JTable table = new JTable(tableModel);
		JScrollPane scroller = new JScrollPane(table);
		JFrame window = new JFrame("MyTableModel Sample");
		window.add(scroller);
		window.pack();
		window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		window.setVisible(true);
	}
}
Questo mostra una tabella con 5 colonne e nessuna riga. Ma se usiamo il notro metodo aggiungiRiga:

Codice:
import javax.swing.*;
import javax.swing.table.*;

public class Main {
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new Main().start();
			}
		});
	}

	private final MyTableModel tableModel = new MyTableModel();

	private void start() {
		tableModel.aggiungiRiga("1", "Pippo");
		tableModel.aggiungiRiga("2", "Gianni");
		JTable table = new JTable(tableModel);
		JScrollPane scroller = new JScrollPane(table);
		JFrame window = new JFrame("MyTableModel Sample");
		window.add(scroller);
		window.pack();
		window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		window.setVisible(true);
	}
}
Notiamo come effettivamente il comportamento del modello rispecchi le nostre necessità: possiamo aggiungere una riga

specificando i suoi due valori iniziali.

A questo punto c'è un inghippo di intrepretazione.



Io questo lo vedo così: quando vuoi inserire un dato nella tabella, lo fai attraverso un metodo che richiede il

valore della chiave primaria, il nome della colonna a cui corriponde il valore ed il valore da inserire. Ma qui

occorrerà poi stabilire cosa deve succedere nel caso in cui manchi una riga con quella chiave primaria. Comunque,

restando alla prima parte, potremmo pensare all'introduzione di un metodo di questo genere:

setValore(String chiavePrimaria, String nomeColonna, String valore)

realizzato ad esempio in questo modo:

Codice:
import javax.swing.table.*;
import java.util.*;

public class MyTableModel extends AbstractTableModel {
	private String[] nomiColonne = { "ID", "NOME", "CF", "P.IVA", "TEL" };
	private Map<String, Integer> mappaNomiColonne = new HashMap<String, Integer>();
	private LinkedList<String[]> righe = new LinkedList<String[]>();
	private int numeroDiColonne = 5;

	public MyTableModel() {
		for(int i = 0; i < nomiColonne.length; i++) {
			mappaNomiColonne.put(nomiColonne[i], i);
		}
	}

	public String getColumnName(int column) {
		return nomiColonne[column];
	}

	public int getColumnCount() {
		return numeroDiColonne;
	}

	public int getRowCount() {
		return righe.size();
	}

	public Object getValueAt(int indiceRiga, int indiceColonna) {
		String[] riga = righe.get(indiceRiga);
		return riga[indiceColonna];
	}

	public void aggiungiRiga(String c1, String c2) {
		String[] riga = new String[5];
		riga[0] = c1;
		riga[1] = c2;
		righe.add(riga);
		fireTableRowsInserted(righe.size() - 1, righe.size() - 1);
	}

	public void setValore(String chiavePrimaria, String nomeColonna, String valore) throws Exception {
		int indiceRiga = getIndiceRiga(chiavePrimaria);
		if(indiceRiga < 0) {
			throw new Exception("Manca una riga per la chiave primaria: " + chiavePrimaria);
		}
		String[] riga = righe.get(indiceRiga);
		int indiceColonna = getIndiceColonna(nomeColonna);
		if(indiceColonna < 0) {
			throw new Exception("Manga una colonna di nome: " + nomeColonna);
		}
		riga[indiceColonna] = valore;
		fireTableRowsUpdated(indiceRiga, indiceRiga);
	}

	private int getIndiceRiga(String chiavePrimariaCercata) {
		int indice = -1;
		for(int i = 0; i < righe.size() && indice == -1; i++) {
			String chiavePrimariaRiga = righe.get(i)[0];
			if(chiavePrimariaRiga.equals(chiavePrimariaCercata)) {
				indice = i;
			}
		}
		return indice;
	}

	private int getIndiceColonna(String nomeColonna) {
		Integer indice = mappaNomiColonne.get(nomeColonna);
		return indice != null ? indice : -1;
	}
}
Ometto l'intera classe Main e indico solo un caso d'uso. Supponendo di aver introdotto due righe:

Codice:
tableModel.aggiungiRiga("1", "Pippo");
tableModel.aggiungiRiga("2", "Gianni");
L'inserimento di un valore per la colonna TEL, riga di chiave primaria "2", si produrrebbe con:

Codice:
try {
	tableModel.setValore("2", "TEL", "555-9191");
} catch(Exception ex) {
	ex.printStackTrace();
}
Ci sono poi altre questioni relative all'inserimento di valori tramite l'interazione utente. Quello che qui abbiamo fatto è stato definire un modus operandi "programmatico". Siccome sono andato un po' a naso, prima di vedere il resto aspetto di sapere se quello che ho scritto chiarisce i dubbi che hai sul come procedere.
ok questo è ok ... e se volessi modificare i nomi delle colonne e i colori di sfondo di ciascuna riga di Jtable ?
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2007, 16:17   #6
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Riguardo la questione del TableModel l'ho fatto così :

Codice:
import javax.swing.table.*;
import java.util.*;

public class MyTableModel extends AbstractTableModel {
    
    Vector canali_mod = null;
    
    public MyTableModel(Vector canali)
    {
       
       canali_mod = canali;
    }
    

    public int getRowCount() {
        return canali_mod.size();
        
    }

    public int getColumnCount() {
        
        Vector appoggio = (Vector) canali_mod.get(0);
        return appoggio.size();
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        
            
        Vector appoggio = (Vector) canali_mod.get(rowIndex);
        
        return appoggio.get(columnIndex);
    }

}
Ho realizzato un vettore di vettori .. quindi ogni volta che intendo modificare aggiungo al vettore di vettori e riplotto il modello
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2007, 16:30   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Vector è una classe "legacy": esiste per questioni di retrocompatibilità. Al suo posto dovresti usare ArrayList.

ArrayList<ArrayList<String>> canaliMod eccetera...

Una tabella estrai i nomi delle colonne dal suo modello, invocando il metodo getColumnName(int index) di quest'ultimo. Fai restituire a questo metodo le stringhe opportune e avrai i nomi che desideri.

Per colorare le righe devi creare un TableCellRenderer. Se vuoi posso farti un esempio (stavolta breve, lo prometto ).
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2007, 16:38   #8
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Vector è una classe "legacy": esiste per questioni di retrocompatibilità. Al suo posto dovresti usare ArrayList.

ArrayList<ArrayList<String>> canaliMod eccetera...

Una tabella estrai i nomi delle colonne dal suo modello, invocando il metodo getColumnName(int index) di quest'ultimo. Fai restituire a questo metodo le stringhe opportune e avrai i nomi che desideri.

Per colorare le righe devi creare un TableCellRenderer. Se vuoi posso farti un esempio (stavolta breve, lo prometto ).
Ok grazie mille ... e ancora grazie per prima ...
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2007, 16:57   #9
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Per l'aspetto la questione può diventare intricata ma ai minimi termini si riduce a:

Codice:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class MyTableRenderer extends DefaultTableCellRenderer {

	public Component getTableCellRendererComponent(JTable table, Object value,
		boolean isSelected, boolean hasFocus, int row, int column)
	{
		Component original = super.getTableCellRendererComponent(
			table, value, isSelected, hasFocus, row, column);
		Color background =
			isSelected ?
			table.getSelectionBackground() :
			row % 2 == 0 ?
			Color.LIGHT_GRAY :
			table.getBackground();
		original.setBackground(background);
		return original;
	}
}
La classe qui sopra definisce l'aspetto di una cella. Precisamente, una tabella usa l'immagine del Component restituito dal metodo getTableCellRendererComponent di un TableCellRenderer per rappresentare ogni cella. MyTableRender modifica una classe già esistente, DefaultTableCellRenderer per applicare alle celle uno sfondo di un colore diverso per le righe pari rispetto alle dispari (una bianca, una grigia, una bianca, una grigia eccetera).

Per applicare il renderer ad una tabella devi semplicemente invocare:

tabella.setDefaultRenderer(Object.class, new MyTableRenderer());
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2007, 17:01   #10
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Per l'aspetto la questione può diventare intricata ma ai minimi termini si riduce a:

Codice:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class MyTableRenderer extends DefaultTableCellRenderer {

	public Component getTableCellRendererComponent(JTable table, Object value,
		boolean isSelected, boolean hasFocus, int row, int column)
	{
		Component original = super.getTableCellRendererComponent(
			table, value, isSelected, hasFocus, row, column);
		Color background =
			isSelected ?
			table.getSelectionBackground() :
			row % 2 == 0 ?
			Color.LIGHT_GRAY :
			table.getBackground();
		original.setBackground(background);
		return original;
	}
}
La classe qui sopra definisce l'aspetto di una cella. Precisamente, una tabella usa l'immagine del Component restituito dal metodo getTableCellRendererComponent di un TableCellRenderer per rappresentare ogni cella. MyTableRender modifica una classe già esistente, DefaultTableCellRenderer per applicare alle celle uno sfondo di un colore diverso per le righe pari rispetto alle dispari (una bianca, una grigia, una bianca, una grigia eccetera).

Per applicare il renderer ad una tabella devi semplicemente invocare:

tabella.setDefaultRenderer(Object.class, new MyTableRenderer());
Che intendi per Object.class ?
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2007, 17:20   #11
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Non è tanto quello che intendo io quanto quello che intende il linguaggio di programmazione Java.

L'espressione:

NomeDiUnTipo.class

Restituisce un riferimento al tipo nominato. Cioè:

Object.class è un'espressione che restituisce un valore di tipo Class<Object>.

String.class è un'espressione che restituisce un valore di tipo Class<String>.

e così via per ogni Tipo.

Il metodo setDefaultRenderer richiede un riferimento di tipo Class. Il riferimento di tipo Class specifica quale colonna userà quel renderer. Ogni colonna di una tabella è associata ad un tipo di oggetti. La tabella usa il renderer specificato per disegnare le celle della colonna il cui tipo è quello usato nel metodo setDefaultRenderer. Nel nostro caso, per ogni colonna le cui celle contengono valori di tipo Object sarà usato il renderer MyTableRenderer.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2007, 14:05   #12
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Mi sono creato la MyTableRenderer in modo che le celle di una certa colonna cambino colore in funzione del dato contenute in esse. Però vorrei fare che tutta la riga mi cambi dello stesso colore in funzione del dato contenuto in quella cella.

Codice:
public class MyTableRenderer extends DefaultTableCellRenderer {

	public Component getTableCellRendererComponent(JTable table, Object value,
		boolean isSelected, boolean hasFocus, int row, int column)
	{
            
                
		Component original = super.getTableCellRendererComponent(
			table, value, isSelected, hasFocus, row, column);

                Color background = table.getBackground();
                Color grid = Color.YELLOW;
                
                if (column == 6)
                {
                    String valore = String.valueOf(value);
                    Long secondi = Long.valueOf(valore)*1000;
                    Long now = System.currentTimeMillis();
                    if ((now-secondi > 120000)&&(now-secondi<=600000))
                    {
                        background = Color.ORANGE;
                    }
                    else if (now-secondi > 600000)
                    {
                        background = Color.RED;
                    }
                    else
                    {
                        background = Color.GREEN;
                    }
                }
		original.setBackground(background);
                
		return original;
	}
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2007, 14:22   #13
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Puoi usare il parametro table (e il suo metodo getValueAt(row, col)) per collegare la proiezione di una cella di una riga al valore di un'altra cella in quella riga.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2007, 14:25   #14
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Meno male che me l'hai detto guarda cosa mi ero inventato :

Codice:
public class MyTableRenderer extends DefaultTableCellRenderer {

        Vector canali = null;
        Vector riga_colore=new Vector();
        public MyTableRenderer(Vector canals)
        {
            canali=canals;
            for (int i=0;i<canali.size();i++)
            {
                Vector appoggio = (Vector) canali.get(i);
                String valore = String.valueOf(appoggio.get(6));
                Long secondi = Long.valueOf(valore)*1000;
                Long now = System.currentTimeMillis();
                if ((now-secondi > 120000)&&(now-secondi<=600000))
                    {
                        Vector temp = new Vector();
                        temp.addElement(i);
                        temp.addElement(Color.ORANGE);
                        riga_colore.addElement(temp);
                            
                    }
                    else if (now-secondi > 600000)
                    {
                        Vector temp = new Vector();
                        temp.addElement(i);
                        temp.addElement(Color.RED);
                        riga_colore.addElement(temp);
                    }
                    else
                    {
                        Vector temp = new Vector();
                        temp.addElement(i);
                        temp.addElement(Color.GREEN);
                        riga_colore.addElement(temp);
                    }
                
            }
        }
	public Component getTableCellRendererComponent(JTable table, Object value,
		boolean isSelected, boolean hasFocus, int row, int column)
	{
            
                
		Component original = super.getTableCellRendererComponent(
			table, value, isSelected, hasFocus, row, column);

                Color background = table.getBackground();
                Color grid = Color.YELLOW;
                
               /* if (column == 6)
                {
                    String valore = String.valueOf(value);
                    Long secondi = Long.valueOf(valore)*1000;
                    Long now = System.currentTimeMillis();
                    if ((now-secondi > 120000)&&(now-secondi<=600000))
                    {
                        background = Color.ORANGE;
                    }
                    else if (now-secondi > 600000)
                    {
                        background = Color.RED;
                    }
                    else
                    {
                        background = Color.GREEN;
                    }
                }*/
                
                Vector appoggio = (Vector) riga_colore.get(row)  ;
                background = (Color) appoggio.get(1); 
		original.setBackground(background);
                
		return original;
	}
}
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2007, 14:33   #15
leon84
Senior Member
 
L'Avatar di leon84
 
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
Ma per il ridimensionamento automatico delle celle ? Nel senso che : voglio che la larghezza delle colonne si adatti al contenuto delle stesse ...
leon84 è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2007, 15:12   #16
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Devi farlo a mano. Le API ti danno la possibilità (TableColumn) di adattare la larghezza delle colonne alla larghezza dell'intestazione. Non prevedono, invece, l'adattamento alla larghezza del contenuto della cella (genere "assumi la larghezza della cella col contenuto più largo).
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2007, 12:50   #17
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Ciao,

volevo sapere una cosa.
Ho sempre usato JTable (magari non a livello molto avanzato) per mostrare dati e per farli visualizzare ho sempre passato come argomento delle matrici contenenti i dati.

Per fare ciò, mi sono scritto un metodo che fa la query e restituisce la matrice... che poi passerò a JTable. E' questa la procedura corretta o ne esiste una migliore?
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2007, 13:11   #18
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Una volta che hai per le mani una tabella hai già toccato il fondo dell'interazione utente.

Questo rende più o meno irrilevante tutto il resto.

In ogni caso, non vedo controindicazioni al tuo metodo.

Teoricamente potresti usare TableModel per nascondere la provenienza dei dati ma si tratta di un mezzo meno immediato di quanto possa sembrare. La tabella richiede al modello i dati riga per riga, colonna per colonna. Per creare un TableModel che prelevi i dati direttamente dal database occorre creare un qualche genere di "caching" delle informazioni, onde evitare di fare una query per ogni richiesta getValueAt.

Dovendo scegliere tra questo modo e il tuo, io sceglierei il tuo :
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2007, 13:22   #19
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi

Dovendo scegliere tra questo modo e il tuo, io sceglierei il tuo :
Woow! Grazie! Allora c'ho azzeccato!
Il tuo parere è stato molto utile per me, ottimo thread questo, e soprattutto molto utile.

Ciao!!!
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
La Ferrari Elettrica non è la cau...
Ricarica da record: Zeekr supera i 1.300...
Un 'capezzolo' con feedback aptico al po...
Porsche Taycan Rush a Misano: prima al v...
Installare Windows 11 senza account Micr...
Cina, nuove regole per le auto elettrich...
OPPO A6 Pro arriva in Italia a 299,99 eu...
Black Myth: Wukong, oggi un maxi aggiorn...
Nomad in missione senza alcun controllo ...
Apple prepara il chip H3 e nuovi AirPods...
Battlefield 6 è uno spettacolo an...
Hyundai Ioniq 9, prima prova: viaggiare ...
Allarme blackout in Spagna: la rete elet...
MindsEye, rivolta dei dipendenti contro ...
In Cina Xiaomi SU7 Ultra prende fuoco do...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:34.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v