|
|
|
|
Strumenti |
08-05-2007, 08:48 | #121 |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
da quel che ho capito non restituisce nessuna classe, ma restituisce un url che punta all percorso passato. La base del percorso è il classpath dell'applicazione.
Ultima modifica di thebol : 08-05-2007 alle 09:02. |
08-05-2007, 09:54 | #122 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Il metodo getClass() restituisce un riferimento di tipo Class<X>. Questo riferimento di tipo Class<X> è la classe dell'istanza che subisce l'invocazione getClass(). Genere:
String s = new String(); Class<String> c = s.getClass(); Integer n = new Integer(10); Class<Integer> c = n.getClass(); Pippo p = new Pippo(); Class<Pippo> c = p.getClass(); eccetera. Ogni classe è associata al suo caricatore (ClassLoader). Il caricatore di classi è un oggetto che trova, legge traduce e carica nella jvm il codice byte contenuto nei file class. Il metodo getResource delle istanze della classe Class<T> usa la capacità del caricatore di classi di trovare dei file.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
08-05-2007, 10:06 | #123 | |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
Quote:
|
|
08-05-2007, 10:37 | #124 |
Member
Iscritto dal: Dec 2006
Messaggi: 201
|
Sono riuscito a eliminare i valori di deicbel non voluti dalla griglia ma ho difficoltà a spostare le etichette e le righe corrispondenti a 25 e 55 decibel !
In pratica per 25 (quindi anche 30) e 55 (quindi anche 60) ho un'altezzaEtichettaDecibel diversa e una altezzaRiga diversa. precisamente la metà Sono riuscito a farlo per il 25 ma il codice è illeggibile e confuso Codice PHP:
Forse disegnare prima le etichette dei multipli di 10 e poi quelle di 25 e 55 ? Ultima modifica di spillo491 : 08-05-2007 alle 11:00. |
08-05-2007, 11:26 | #125 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
La griglia dell'audiogramma è un componente di una certa complessità. Avere qualche problema nel realizzarlo non è cosa di cui stupirsi.
Puoi costruire un programma componendo le soluzioni che trovi in prototipi creati separatamente. Prova a scrivere un'applicazione che apre una finestra dentro a cui c'è un componente nel quale è disegnata quella mini-griglia. Lo scheletro potrebbe essere: Codice:
import java.awt.*; import java.awt.geom.*; import javax.swing.*; public class Main { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { buildAndShow(); } }); } private static void buildAndShow() { JFrame frame = new JFrame("Grid sample"); GridPanel panel = new GridPanel(); frame.add(panel); frame.pack(); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setVisible(true); } } class GridPanel extends JComponent { private int colWidth = 50; private int rowHeight = 50; private int rowCount = 5; public Dimension getPreferredSize() { Dimension standardSize = super.getPreferredSize(); standardSize.width = colWidth; standardSize.height = rowCount * rowHeight; return standardSize; } public void paint(Graphics graphics) { Graphics2D g = (Graphics2D)graphics; //pronti via:... } } Calma, sangue freddo e coltello tra i denti.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
08-05-2007, 19:29 | #126 |
Member
Iscritto dal: Dec 2006
Messaggi: 201
|
Perchè mi da errore ?
Codice PHP:
|
08-05-2007, 19:36 | #127 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Ti do un indizio. Guarda le dichiarazioni import che hai fatto. Poi guarda in che package sta JComponent.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
08-05-2007, 20:07 | #128 |
Member
Iscritto dal: Dec 2006
Messaggi: 201
|
Giusto , devo importare javax.swing. Per usare setpaint non basta importare java.awt.* ?
|
08-05-2007, 20:18 | #129 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
La clausola
import a meno che non sia import static importa le definizioni dei tipi. Classi, interfacce, enumerativi, annotazioni. Vale a dire che tu scrivi: import java.awt.*; non per usare "setPaint" ma per usare (tra gli altri) "Graphics". Poi le istanze di Graphics hanno un metodo setPaint ma il fatto che tu possa usare setPaint non dipende dalla clausola import.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
08-05-2007, 20:27 | #130 |
Member
Iscritto dal: Dec 2006
Messaggi: 201
|
Ok ho capito devo usare un oggetto Graphics2D quindi dire
g.setPaint non graphics.setPAint |
08-05-2007, 20:30 | #131 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
No. Ni. Non lo so. Prima ho scritto "per usare setPaint devi avere Graphics" ma ho sbagliato. setPaint è un metodo di Graphics2D, non di Graphics. A parte questo il resto vale. Cioè Graphics2D "ti arriva" perchè importi il package java.awt.*
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
09-05-2007, 10:13 | #132 |
Member
Iscritto dal: Dec 2006
Messaggi: 201
|
Ciao PGi sono riuscito a scrivere questo codice ed ottenere quel disegno che avevvo messo in allegato, adesso devo riuscire a generalizzarlo ? Ti sembra un buon inizio ?
Codice PHP:
|
09-05-2007, 10:44 | #133 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
C'è un problema di "accumulo". Prova a ridimensionare la finestra. Noterai che la griglia scompare. A rallentatore si vede che schizza verso il basso.
Il metodo paint è invocato dall'API Swing più e più volte. Se usi dei campi come valori di riferimento devi fare in modo che quei campi abbiano il valore corretto a prescindere dal numero di volte per cui è invocato il metodo in cui li usi. Nel caso di specie, il problema è che il campo "y" viene incrementato nel metodo paint. Questo valore dovrebbe essere 10 (origine.getY()) all'inizio del disegno ma invocazioni successive di paint si ritrovano ad avere un y che vale inizialmente "sempre di più". Per correggere il problema è sufficiente trasformare la dichiarazione di origine e y da dichiarazione di campo a dichiarazione di variabile locale al metodo paint. Codice:
public void paint(Graphics graphics) { Point2D origine = new Point2D.Double(10, 10); double y = origine.getY(); //eccetera Il fatto che talune righe sono più basse di altre influisce sulla punto a partire dal quale disegni le rispettive linee. E' una cosa che certamente hai già notato perchè il codice che hai incollato verifica questa condizione mutando il valore di incremento per y. Si può fare la stessa cosa in PainterAudiogramma? Ricorda che il codice è materia viva, plasmabile. Soprattutto il codice Java. Ad esempio puoi prendere PainterAudiogramma e commentare le linee che vanno da 68 a 140. Ti resta in pratica: Codice:
public void paint(Audiogramma audiogramma, Graphics2D graphics, DatiPainterAudiogramma dati) { LinkedList<Frequenza> valoriFrequenze = getFrequenzeOrdinateNonNull(audiogramma); LinkedList<Decibel> valoriDecibel = getDecibelOrdinatiNonNull(audiogramma); double larghezzaColonnaIntestazione = calcolaLarghezzaColonnaIntestazione( audiogramma, graphics, dati); double altezzaRigaIntestazione = calcolaAltezzaRigaIntestazione( audiogramma, graphics, dati); graphics.setPaint(Color.BLACK); disegnaStringaAlCentro( new Rectangle2D.Double(0, MARGINE_BASSO_ETICHETTE_INTESTAZIONE, larghezzaColonnaIntestazione, altezzaRigaIntestazione), graphics, dati.getFontEtichette(), "PERDITA IN DECIBEL"); double altezzaEtichetteDecibel = calcolaAltezzaEtichetteDecibel( audiogramma, graphics, dati); double larghezzaEtichetteDecibel = calcolaLarghezzaEtichetteDecibel( audiogramma, graphics, dati); int indiceScorrimentoDecibel = 0; Point2D origine = new Point2D.Double( larghezzaColonnaIntestazione / 2 + larghezzaEtichetteDecibel, altezzaRigaIntestazione); double xArea = origine.getX() - larghezzaEtichetteDecibel; for(Decibel d : valoriDecibel) { String testo = String.valueOf(d); if(d.intValue() == 25) { testo = "Normale " + testo; } double yArea = origine.getY() + indiceScorrimentoDecibel * altezzaEtichetteDecibel; Rectangle2D area = new Rectangle2D.Double( xArea + MARGINE_DESTRO_ETICHETTE_DECIBEL, yArea + MARGINE_BASSO_ETICHETTE_DECIBEL, larghezzaEtichetteDecibel, altezzaEtichetteDecibel); disegnaStringaInBassoADestra(area, graphics, dati.getFontEtichette(), testo); indiceScorrimentoDecibel++; } /* ... commentato ... */ }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
09-05-2007, 11:45 | #134 |
Member
Iscritto dal: Dec 2006
Messaggi: 201
|
Si il problema della finestra l'avevo notato, ora ho risolto facendo come mi hai detto tu.
Per quanto riguarda la modifica di PainterAudiogramma dici di mantenere la parte in cui vengono disegnate le etichette e modificare solo la fase in cui disegno la griglia ? |
09-05-2007, 12:07 | #135 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Il disegno della griglia dipende dal disegno delle etichette. O, meglio, il disegno delle linee e delle etichette segue la stessa idea di base che, al momento, consiste nell'avere un'altezza iniziale uguale per tutte le righe.
Variando l'altezza delle righe non so quanto il codice già scritto possa essere semplicemente aggiustato. E' più facile specializzare che generalizzare. Rispetto a quello che vuoi ottenere (cioè la possibilità che alcune righe abbiano altezza diversa dalle altre) il codice di paint è speciale (tutte le righe hanno la stessa altezza). Io penso che il nuovo paint possa essere diviso in due parti. Nella prima calcoli l'altezza di ogni riga e la rendi accessibile, magari attraverso una struttura dati indicizzata, al resto del codice. Una cosa del genere. Hai N righe? Crei un array di N interi. Per ogni riga di indice K calcoli la sua altezza e la infili nell'array in posizione K. Dopo aver fatto tutti i conti passi a disegnare le righe, una per volta, in un ciclo indicizzato da 0 a N. Ogni passaggio del ciclo recupera l'altezza di quella riga accedendo al valore di indice x (0 - N) nell'array delle altezze. E' un po' sintetica come spiegazione ma spero che renda l'idea.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
09-05-2007, 12:36 | #136 |
Member
Iscritto dal: Dec 2006
Messaggi: 201
|
Tu dici proprio una cosa del tipo ?
int[] altezzaRighe = new int[N] Ma nel ciclo disegno contemporaneamente etichette e griglia ? no vero, faccio due cicli separati |
09-05-2007, 12:43 | #137 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Fai come ti sembra più comodo. Un ciclo solo sarebbe più efficiente ma l'efficienza è una questione di cui non mi occuperei in questo momento.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
09-05-2007, 17:20 | #138 |
Member
Iscritto dal: Dec 2006
Messaggi: 201
|
Allora ho modificato il metodo calcolaAltezzaEtichetteDecibel come segue:
Codice PHP:
Codice PHP:
|
09-05-2007, 17:38 | #139 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Il ciclo foreach
for(bli : bla) è una "comodità". A volte. A volte no. Nel tuo caso è no. Per avere l'indice, puoi cambiare la linea: Codice:
for(Decibel d : decibels) { Codice:
for(int indice = 0; indice < decibels.size(); indice++) { Decibel d = decibels.get(indice); //eccetera
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
11-05-2007, 14:43 | #140 |
Member
Iscritto dal: Dec 2006
Messaggi: 201
|
Ciao PGI purtroppo in questi giorni sarò un po preso dal lavoro e in più ieri mi è partito l'hard-disk del mio portatile era vecchio e dovrò cambiarlo
Spero di poter continuare questo programmino perchè mi ha preso parecchio ciao |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:24.