problemi con programma proposto sul sito

  • Creatore Discussione Creatore Discussione pavel
  • Data di inizio Data di inizio

pavel

Nuovo Utente
11 Ott 2010
6
0
0
ciao!

sto cercando di replicare il programma paint proposto sul sito ma appena ho importato il codice da voi proposto ho iniziato ad avere una miriade di errori ho provato a modificarlo + e + volte ma ho ancora degli errori(oltre al fatto che mi dice che il main non esiste )
vi prego datemi una mano l'errore che ho ora è questo)

Codice:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Line2D;
import java.awt.geom.Line2D.Double;
import java.util.Stack;

public class PaintFinestra extends JFrame
{
     private Color [] color = {Color.black,Color.blue,Color.cyan,Color.DARK_GRAY,
                Color.gray,Color.green,Color.LIGHT_GRAY,Color.magenta,Color.orange,Color.pink,
                Color.white};
    private Pulsante[] controllo;
    private JPanel pannelloBottoni;
    private PaintPannello pannelloprincipale;
    private JComboBox stroke;   
    private Color coloreStringa;
    public Integer spessore; 
    public PaintFinestra(String title)
    {
        super(title);       
        spessore = 1;       
        pannelloBottoni = new JPanel();   
        controllo = new Pulsante[11];       
        stroke = new JComboBox();
        stroke.addItem(new Spessore(1));
        stroke.addItem(new Spessore(2));
        stroke.addItem(new Spessore(3));
        stroke.addItem(new Spessore(4));
        stroke.addItem(new Spessore(5));
        stroke.addItem(new Spessore(6));
        stroke.addItem(new Spessore(7));
        stroke.addItem(new Spessore(8));
        stroke.addItem(new Spessore(9));
        stroke.addItem(new Spessore(10));
        stroke.addActionListener(new Spessorizza());
        for (int i = 0; i < 11; ++i)
        {
            controllo[i] = new Pulsante(color[i]);           
            pannelloBottoni.add(controllo[i]);
            controllo[i].addActionListener(new GestionePulsanti());
        }
        

        pannelloprincipale = new PaintPannello();       
        this.add(pannelloBottoni,BorderLayout.SOUTH);
        this.add(pannelloprincipale, BorderLayout.CENTER);
        this.add(stroke,BorderLayout.NORTH);
    }
    public class Spessorizza implements ActionListener
    {
          public void actionPerformed(ActionEvent e)
          {
               spessore =  ((Spessore)stroke.getSelectedItem()).pixel;
          }
    }
    class GestionePulsanti implements ActionListener
    {
        
        public void actionPerformed(ActionEvent event)
        {
            Pulsante source = (Pulsante)event.getSource();
             coloreStringa = source.color;            
        }
        
        
    } 
    public class PaintPannello extends JPanel 
    {   
        private float lastX, lastY; 
        private Stack lines; 
        private boolean richiestaRepaint;
        
        public class Linea
        {
            public Line2D linea;
            public Integer stroke;
            public Color color;
        }       
          
        
        public PaintPannello()
        {
            super();           
            lines = new Stack();           
            richiestaRepaint = false;         
            setLayout(new BorderLayout());                       
            this.addMouseListener(new HandleMouseClicked());
            this.addMouseMotionListener(new HandleMouseDragged());
        }
        
        
        private class HandleMouseClicked extends MouseAdapter
        {
            public void mousePressed(MouseEvent e)
            {
                lastX = e.getX();
                lastY = e.getY();
            }
        }
        
        private class HandleMouseDragged extends MouseMotionAdapter
        {
            public void mouseDragged(MouseEvent e)
            {
                int x = e.getX();
                int y = e.getY();           
                Linea temp = new Linea();   
                temp.linea = new Line2D.Double(lastX,lastY,x,y);
                temp.color =  coloreStringa;        
                temp.stroke = spessore;
                lines.add(temp);              
                lastX = x;
                lastY = y;
                richiestaRepaint = true;
                repaint();
            }
        }    
        
        public void paintComponent(Graphics g)
        {
            Graphics2D g2 = (Graphics2D)g;       
            if (richiestaRepaint)
            {
                richiestaRepaint = false;  
                Linea temp1 = new Linea(); 
                temp1 =(PaintFinestra.PaintPannello.Linea) lines.lastElement();
                g2.setPaint(temp1.color);
                g2.setStroke(new BasicStroke(temp1.stroke));
                g2.draw(temp1.linea);               
            }
            else
            {   
                for ([COLOR="Red"]Linea line : lines[/COLOR])
                {                   
                    g2.setPaint(line.color);
                    g2.setStroke(new BasicStroke(line.stroke));
                    g2.draw(line.linea);
                }
            }            
        }       

    }

}


dove ho segnato mi da errore.... e non capisco perchè
 
...
vi prego datemi una mano l'errore che ho ora è questo
...
dove ho segnato mi da errore.... e non capisco perchè

Che errore ti da? Mica abbiamo la palla di vetro.

...
(oltre al fatto che mi dice che il main non esiste )
...

Nel link da te postato successivamente una delle prime cose che leggo è "La classe PaintPrincipale" fornendo il codice della classe che contiene il main per lanciare l'applicazione!!!!!
Non capisco se leggete gli articoli oppure scopiazzate solemente il codice. Una volta si imparavano le cose a suon di manuali in inglese oggi non si dedica neanche più un minuto alla lettura di un articolo!!
 
Che errore ti da? Mica abbiamo la palla di vetro.



Nel link da te postato successivamente una delle prime cose che leggo è "La classe PaintPrincipale" fornendo il codice della classe che contiene il main per lanciare l'applicazione!!!!!
Non capisco se leggete gli articoli oppure scopiazzate solemente il codice. Una volta si imparavano le cose a suon di manuali in inglese oggi non si dedica neanche più un minuto alla lettura di un articolo!!


guarda che non mi sembra il caso di rispondere in questo modo....
1 non sono un programmatore dell'ultima ora quindi sto commento del "ai miei tempi" potevi anche risparmiartelo
2 ho scoperto che l'errore del main era dovuto ad una versione del java troppo vecchia (avevo la 5 e mi serviva la 6)

3 nel pezzo segnato di rosso mi da errore su lines dicendo che un tipo oggetto non può diventare vector o una cosa del genere ... ma più che altro dalle mie conoscenze di informatica non capisco come possa funzionare un for del genere nel senso che non riesco proprio a capirne il funzionamento....
 
Nell'esempio non vedo codice che giri solamente con la versione 6 di java per cui mi sembra alquanto bizzarro che il problema col main fosse dovuto all'utilizzo della versione 5 di java. Inoltre per non essere un programmatore dell'ultima ora la tua descrizione dell'errore ("...un tipo oggetto non può diventare vector o una cosa del genere...") mi sembra un pochino maccheronica. Infine quella particolare sintassi del for non dovrebbe essere tanto misteriosa per un programmatore "vissuto".
Premesso ciò se ti va di fornire un'accurata descrizione dell'eccezione che ti viene restituita magari sarebbe anche possibile darti una mano.
 
Tra l'altro ho provato il programma proposto nell'articolo ed a parte qualche import e la banale modifica ad una riga di codice con l'aggiunta del generics:

Codice:
private Stack lines;

che diventa:

Codice:
private Stack<Linea> lines;

funziona perfettamente.
 
su quello dell'essere stato poco preciso ti do ragione ma ieri quando ti ho risp non ero al pc del lavoro e quindi non potevo essere + preciso.

ora ti spiego meglio

1
l'errore del main mi sembrava assurdo anche a me ..al che ho compilato il semplicissimo hello world e non andava al che mi è sorto un dubbio e ho controllato l'errore sul sito della oracle e infatti era un errore dovuto ad eclipse riguardandante la classpatch e con il semplice aggiornamento della jdk il problema è stato risolto

2
l'errore che da a me è su quella particolare riga di codice è
"cannot convert from element type object to Paintfinestra.PaintPannello.Linea"


3
come fa ad andarti quel codice io ho dovuto modificarlo in un sacco di punti per farlo andare.
ad esempio nella classe spesso ho dovuto aggiungere alla funzione tu string
Codice:
public String toString()
    {
        pixel1 = String.valueOf(pixel);
        return pixel1;       
    }

perchè mi dava errore dicendo che pixel non poteva essere ritornato visto che non era uno string oppure ho dovuto implementare tutta la classe paint pannello nella classa paintfinestra (Come vedi sopra) perchè mi diva errore su
Codice:
temp.color =  coloreStringa;        
temp.stroke = spessore;
nella funzione mouseDragged


detto questo visto che a te funziona proverò a riscriverlo da zero anche perchè fracamente sto programma mi sta facendo arrabbiare mi sento quasi uno alle prime armi e la cosa mi irrita...

e comunque visto che ci siamo mi aiuteresti a capire quel for
Codice:
 for (Linea line : lines)
come funzionziona non lo capisco

grazie
 
Allora, per quanto riguarda il punto 2 lo risolvi modificando la riga di codice:

Codice:
private Stack lines;

aggiungento il generics:

Codice:
private Stack<Linea> lines;

infatti la classe Stack contiene oggetti di tipo object per cui o effettui un cast specifico nel momento in cui recuperi l'oggetto oppure aggiungi il generics che forza il cast al tipo specificato (Linea nel nostro caso) evitando di dover effettuare un cast esplicito.
Il generics ti risolve anche gli errori che hai su temp.color ecc.

Il punto 3 lo sisolvi modificando il codice in questo modo:

Codice:
public String toString() {
    return String.valueOf(pixel);       
}

per cui la tua modifica è corretta.
Infine non resta che aggiungere i vari import mancanti.

Per quanto riguarda il for invece, quello che vedi è una nuova sintassi introdotta a partire da Java 5. In pratica il codice che vedi:

Codice:
for (Linea line : lines) {
    ...
}

è equivalente a:

Codice:
for (int i = 0; i < lines.size(); i++) {
    Linea line = lines.get(i);
    ...
}

Se hai bisogno di altre info chiedi pure.
Ciao
 
Ultima modifica:
uu preciso questa cosa del for non lo sapevo GRAZIE MILLE!
effettivamente al cast non c'avevo pensato però ignorando cosa significasse il for non capivo cosa fare effettivamente cosi funziona perfettamente .

l'unica cosa che mi sfugge visto che tu hai tenuto le varie classi "divise"

come hai fatto a far vedere
Codice:
      public void mouseDragged(MouseEvent e)
        {
            int x = e.getX();
            int y = e.getY();           
            Linea temp = new Linea();               
            temp.linea = new Line2D.Double(lastX,lastY,x,y);
            temp.color = coloreStringa;
            temp.stroke = spessore;
            lines.add(temp);              
            lastX = x;
            lastY = y;
            richiestaRepaint = true;
            repaint();
        }


coloreStringa e spessore??

io ho messo tutta la classe all'interno dell'altra per non perdere tanto tempo ma siccome non è molto "da informatico" tu come lo hai fatto?
 
Ho semplicemente inserito le classi GestionePulsanti e PaintPannello all'interno della classe PaintFinestra come l'articolo suggeriva.
Per mancanza di tempo non mi sono messo ad ottimizzare il codice, ma mi sono limitato a verificarne il funzionamento. L'esempio infatti dovrebbe essere semplicemente una panoramica sul funzionamento del paint per cui credo sia ottimizzabile.
Ti posto la mia classe PaintFinestra:

Codice:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Line2D;
import java.util.Stack;

public class PaintFinestra extends JFrame {

	private Color[] color = { Color.black, Color.blue, Color.cyan,
			Color.DARK_GRAY, Color.gray, Color.green, Color.LIGHT_GRAY,
			Color.magenta, Color.orange, Color.pink, Color.white };
	private Pulsante[] controllo;
	private JPanel pannelloBottoni;
	private PaintPannello pannelloprincipale;
	private JComboBox stroke;
	private Color coloreStringa;
	public Integer spessore;

	public PaintFinestra(String title) {
		super(title);
		spessore = 1;
		pannelloBottoni = new JPanel();
		controllo = new Pulsante[11];
		stroke = new JComboBox();
		stroke.addItem(new Spessore(1));
		stroke.addItem(new Spessore(2));
		stroke.addItem(new Spessore(3));
		stroke.addItem(new Spessore(4));
		stroke.addItem(new Spessore(5));
		stroke.addItem(new Spessore(6));
		stroke.addItem(new Spessore(7));
		stroke.addItem(new Spessore(8));
		stroke.addItem(new Spessore(9));
		stroke.addItem(new Spessore(10));
		stroke.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				spessore = ((Spessore) stroke.getSelectedItem()).pixel;
			}
		});
		for (int i = 0; i < 11; ++i) {
			controllo[i] = new Pulsante(color[i]);
			pannelloBottoni.add(controllo[i]);
			controllo[i].addActionListener(new GestionePulsanti());
		}
		pannelloprincipale = new PaintPannello();
		this.add(pannelloBottoni, BorderLayout.SOUTH);
		this.add(pannelloprincipale, BorderLayout.CENTER);
		this.add(stroke, BorderLayout.NORTH);
	}

	private class GestionePulsanti implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			Pulsante source = (Pulsante) event.getSource();
			coloreStringa = source.color;
		}
	}

	public class PaintPannello extends JPanel {
		private float lastX, lastY;
		private Stack<Linea> lines;

		public class Linea {
			public Line2D linea;
			public Integer stroke;
			public Color color;
		}

		private boolean richiestaRepaint;

		public PaintPannello() {
			super();
			lines = new Stack();
			richiestaRepaint = false;
			setLayout(new BorderLayout());
			this.addMouseListener(new HandleMouseClicked());
			this.addMouseMotionListener(new HandleMouseDragged());
		}

		private class HandleMouseClicked extends MouseAdapter {
			public void mousePressed(MouseEvent e) {
				lastX = e.getX();
				lastY = e.getY();
			}
		}

		private class HandleMouseDragged extends MouseMotionAdapter {
			public void mouseDragged(MouseEvent e) {
				int x = e.getX();
				int y = e.getY();
				Linea temp = new Linea();
				temp.linea = new Line2D.Double(lastX, lastY, x, y);
				temp.color = coloreStringa;
				temp.stroke = spessore;
				lines.add(temp);
				lastX = x;
				lastY = y;
				richiestaRepaint = true;
				repaint();
			}
		}

		public void paintComponent(Graphics g) {
			Graphics2D g2 = (Graphics2D) g;
			if (richiestaRepaint) {
				richiestaRepaint = false;
				g2.setPaint(lines.lastElement().color);
				g2.setStroke(new BasicStroke(lines.lastElement().stroke));
				g2.draw(lines.lastElement().linea);
			} else {
				for (int i = 0; i < lines.size(); i++) {
					Linea linea = lines.get(i);
				}
				for (Linea line : lines) {
					g2.setPaint(line.color);
					g2.setStroke(new BasicStroke(line.stroke));
					g2.draw(line.linea);
				}
			}
		}
	}

}
 
infatti come ho fatto io cmq ora funziona perfettamente ora lo implementerò nel programma + grande che sto facendo grazie mille per il tuo aiuto ;)


ora cercherò di capire come mai ogni tanto quando tiri la riga rimangono dei punti bianchi..... ora vedrò il da farsi...se per caso tu hai una idea su per quale motivo faccia cosi io sono qui ehehehhe
 

Discussioni simili