JavaError
08-02-2010, 15:35
Ciao a tutti,
Avrei bisogno di un consiglio per completare un piccolo programmino che sto facendo...
Il programma disegna una funzione con dei pallini al posto della tracciatura del grafico, ho fatto decine di prove, ma evidentemente non ho capito bene come si faccia a disegnare "progressivamente" su di un panel... l'applicazione in se funziona e fa quello che deve, solo che non è completa, e dovrei completarla facendo appunto fare la progressione del disegno di tale funzione sul pannello invece me la disegna o tutta ( tutta in blocco) oppure son riuscito a disegnare solo un pallino...
Inoltre la progressione mi è venuto in mente che potrebbe essere "rallentata" attraverso un thread, tuttavia son riuscito a rallentare al massimo l'aggiornamento dello coordinate e non il disegno in se...
So che sto sbagliando il "modo" in cui richiamo il paintComponent(Graphics g)..
però mi sembra che il metodo update() non abbia effetto...
Insomma, mi son un pò impantanato.. qualche consiglio ???
Ho trovato esempi in giro, tuttavia riguardano al 90% applet e purtroppo io non posso lavorare con le applet ma Devo per forza risolvere questo "mistero"...
Grazie in anticipo.
import java.awt.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.*; // necessario per le linee 2D
import javax.swing.*;
import javax.swing.event.*; // necessario per changelistener
import java.util.Random;
class EsercizioTrigonometrico extends JFrame {
private Pannello panTrigo;
private JSlider ctrCicli;
private JButton crea;
private JButton cancella;
private Random rand; // per il numero random
public EsercizioTrigonometrico() {
Container cnt = getContentPane();
panTrigo = new Pannello();
rand = new Random();
crea = new JButton("Draw");
cancella = new JButton("Cancel");
panTrigo.setBounds (0,0,400,400);
panTrigo.creaCordinate();
cnt.add(BorderLayout.CENTER, panTrigo);
cnt.add(BorderLayout.EAST, cancella);
cnt.add(BorderLayout.WEST, crea);
}
// Metodo che genera un colore random
public Color randomColor(){
return(new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255))); // l'ultimo serve per la trasparenza del colore
}
// pannello della funzione trigonometrica
class Pannello extends JPanel {
private int DensPUNTI = 60; // densità dei punti 30
private static final int nrCicli =3; // numero dei cicli
private int nrPunti = 360; // numero dei punti 180
private static final int NrBOLLExCICLO = 30;
private double[] cordinateDouble = new double[nrPunti];// array di double di 180 posizioni ?
private int[] cordinateInt;
// altre dichiarazioni
private int numeroBolle = nrPunti / (NrBOLLExCICLO*nrCicli); // 180 punti diviso 180 bolle
private int maxHeight = 400;
private int maxWidth = 400;
private double h = (double) maxWidth/(double)nrPunti; // Determinazione del passo di campionamento
public Pannello() {
}
public void creaCordinate() {
for(int i = 0; i < nrPunti; i++) {
double rad = (Math.PI / DensPUNTI) * i;
cordinateDouble[i] = Math.sin(rad);
}
// Determinazione delle coordinate intere di visualizzazione
cordinateInt = new int[nrPunti];
for(int i = 0; i < nrPunti; i++) {
cordinateInt[i] = (int)(cordinateDouble[i] * maxHeight/2 * .95+maxHeight/2);
}
}
// uso di paintComponent()
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
for(int i = 0; i < nrPunti; i++) { // Tracciatura del grafico nrPunti
int x1 = (int) ((i)*h);
int y1 = cordinateInt[i];
if(i % numeroBolle == 0) {
g2.setColor(randomColor());
g2.fill(new Ellipse2D.Double(x1,y1, 30, 30));
/* try{
Thread.sleep(100);
repaint();
System.out.println(i);
}catch(InterruptedException e) {}*/
}
}
}
}
public static void main(String[] args) {
JFrame trigonometria = new EsercizioTrigonometrico();
trigonometria.setBounds(100,100,700,500);
trigonometria.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
trigonometria.setVisible(true);
}
}
Dimenticavo...
Sistema Operativo - Ubuntu
Compilatore - Geany 0.16
Avrei bisogno di un consiglio per completare un piccolo programmino che sto facendo...
Il programma disegna una funzione con dei pallini al posto della tracciatura del grafico, ho fatto decine di prove, ma evidentemente non ho capito bene come si faccia a disegnare "progressivamente" su di un panel... l'applicazione in se funziona e fa quello che deve, solo che non è completa, e dovrei completarla facendo appunto fare la progressione del disegno di tale funzione sul pannello invece me la disegna o tutta ( tutta in blocco) oppure son riuscito a disegnare solo un pallino...
Inoltre la progressione mi è venuto in mente che potrebbe essere "rallentata" attraverso un thread, tuttavia son riuscito a rallentare al massimo l'aggiornamento dello coordinate e non il disegno in se...
So che sto sbagliando il "modo" in cui richiamo il paintComponent(Graphics g)..
però mi sembra che il metodo update() non abbia effetto...
Insomma, mi son un pò impantanato.. qualche consiglio ???
Ho trovato esempi in giro, tuttavia riguardano al 90% applet e purtroppo io non posso lavorare con le applet ma Devo per forza risolvere questo "mistero"...
Grazie in anticipo.
import java.awt.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.*; // necessario per le linee 2D
import javax.swing.*;
import javax.swing.event.*; // necessario per changelistener
import java.util.Random;
class EsercizioTrigonometrico extends JFrame {
private Pannello panTrigo;
private JSlider ctrCicli;
private JButton crea;
private JButton cancella;
private Random rand; // per il numero random
public EsercizioTrigonometrico() {
Container cnt = getContentPane();
panTrigo = new Pannello();
rand = new Random();
crea = new JButton("Draw");
cancella = new JButton("Cancel");
panTrigo.setBounds (0,0,400,400);
panTrigo.creaCordinate();
cnt.add(BorderLayout.CENTER, panTrigo);
cnt.add(BorderLayout.EAST, cancella);
cnt.add(BorderLayout.WEST, crea);
}
// Metodo che genera un colore random
public Color randomColor(){
return(new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255))); // l'ultimo serve per la trasparenza del colore
}
// pannello della funzione trigonometrica
class Pannello extends JPanel {
private int DensPUNTI = 60; // densità dei punti 30
private static final int nrCicli =3; // numero dei cicli
private int nrPunti = 360; // numero dei punti 180
private static final int NrBOLLExCICLO = 30;
private double[] cordinateDouble = new double[nrPunti];// array di double di 180 posizioni ?
private int[] cordinateInt;
// altre dichiarazioni
private int numeroBolle = nrPunti / (NrBOLLExCICLO*nrCicli); // 180 punti diviso 180 bolle
private int maxHeight = 400;
private int maxWidth = 400;
private double h = (double) maxWidth/(double)nrPunti; // Determinazione del passo di campionamento
public Pannello() {
}
public void creaCordinate() {
for(int i = 0; i < nrPunti; i++) {
double rad = (Math.PI / DensPUNTI) * i;
cordinateDouble[i] = Math.sin(rad);
}
// Determinazione delle coordinate intere di visualizzazione
cordinateInt = new int[nrPunti];
for(int i = 0; i < nrPunti; i++) {
cordinateInt[i] = (int)(cordinateDouble[i] * maxHeight/2 * .95+maxHeight/2);
}
}
// uso di paintComponent()
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
for(int i = 0; i < nrPunti; i++) { // Tracciatura del grafico nrPunti
int x1 = (int) ((i)*h);
int y1 = cordinateInt[i];
if(i % numeroBolle == 0) {
g2.setColor(randomColor());
g2.fill(new Ellipse2D.Double(x1,y1, 30, 30));
/* try{
Thread.sleep(100);
repaint();
System.out.println(i);
}catch(InterruptedException e) {}*/
}
}
}
}
public static void main(String[] args) {
JFrame trigonometria = new EsercizioTrigonometrico();
trigonometria.setBounds(100,100,700,500);
trigonometria.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
trigonometria.setVisible(true);
}
}
Dimenticavo...
Sistema Operativo - Ubuntu
Compilatore - Geany 0.16