Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    28

    [Java] Lavagna Condivisa

    Ciao a tutti!
    ho un problema che mi tormenta da ormai un pò di tempo, in particolare:
    sto implementando una lavagna condivisa dove più client possono disegnare varie forme geometriche messe a disposizione (linee, rettangoli, etc..). premetto che sto usando swing e che l'area di disegno è una sottoclasse di JPanel, il mio problema è che quando voglio disegnare una linea vorrei che nel frattempo che sto nel metodo MouseDragged mi si crei una linea provvisoria, che segua il puntatore, e che andrà ad essere disegnata quando rilascerò il pulsante del mouse. quello che ottengo è che una volta disegnata la prima linea, la seconda mi cancella la precedente (sicuramente dovuta ad un cattivo uso del metodo repaint() ).
    avete qualche idea su come fare?
    thx in anticipo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Lavagna Condivisa

    Originariamente inviato da J-Hard
    il mio problema è che quando voglio disegnare una linea vorrei che nel frattempo che sto nel metodo MouseDragged mi si crei una linea provvisoria, che segua il puntatore, e che andrà ad essere disegnata quando rilascerò il pulsante del mouse. quello che ottengo è che una volta disegnata la prima linea, la seconda mi cancella la precedente (sicuramente dovuta ad un cattivo uso del metodo repaint() ).
    Senza vedere il codice che hai scritto è molto improbabile riuscire a capire cosa non va.
    Hai le idee chiare sul "painting" nei componenti? Il vero "contesto" di disegno è solo nel paintComponent() (per i componenti Swing). In altri momenti (es. in un mouseDragged) potresti prendere il Graphics e disegnare ma ... non è "permanente", proprio perché il contesto di disegno in cui si dovrebbe ridisegnare il contenuto del componente è nel paintComponent().
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    28

    Re: Re: [Java] Lavagna Condivisa

    Originariamente inviato da andbin
    Senza vedere il codice che hai scritto è molto improbabile riuscire a capire cosa non va.
    Hai le idee chiare sul "painting" nei componenti? Il vero "contesto" di disegno è solo nel paintComponent() (per i componenti Swing). In altri momenti (es. in un mouseDragged) potresti prendere il Graphics e disegnare ma ... non è "permanente", proprio perché il contesto di disegno in cui si dovrebbe ridisegnare il contenuto del componente è nel paintComponent().
    il codice l'ho talmente tanto sporcato che alla fine son tornato al punto di partenza. te lo incollo ugualmente giusto per farti un'idea dello scheletro dell'applicazione.

    questa è la lavagna

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    
    public class WhiteBoard extends JPanel implements MouseListener, MouseMotionListener {
    	
    	private int startX, startY, endX, endY;
    	
    	public WhiteBoard() {
    				
    		this.setBackground(Color.white);
    		
    		this.addMouseListener(this);
    		this.addMouseMotionListener(this);
    
    	}
    	
    	protected void paintComponent(Graphics g){
    		
    		super.paintComponent(g);
    		
    	}
    
    	@Override
    	public void mouseDragged(MouseEvent arg0) {
    		// TODO Auto-generated method stub
    		System.out.println("Mouse Dragged: "+arg0.getX() +" "+arg0.getY());
    		
    		endX = arg0.getX();
    		endY = arg0.getY();
    		
    	}
    
    	@Override
    	public void mouseMoved(MouseEvent arg0) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void mouseClicked(MouseEvent arg0) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void mouseEntered(MouseEvent arg0) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void mouseExited(MouseEvent arg0) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void mousePressed(MouseEvent arg0) {
    		// TODO Auto-generated method stub
    		System.out.println("Mouse Pressed: "+arg0.getX() +" "+arg0.getY());
    		
    		startX = arg0.getX();
    		startY = arg0.getY();
    		
    		endX = arg0.getX();
    		endY = arg0.getY();
    		
    	}
    
    	@Override
    	public void mouseReleased(MouseEvent arg0) {
    		// TODO Auto-generated method stub
    		System.out.println("Mouse Released: "+arg0.getX() +" "+arg0.getY());
    		
    	}
    	
    }
    questa invece è una forma che voglio disegnare sulla lavagna (in questo caso una linea)

    codice:
    import java.awt.Color;
    import java.awt.Graphics;
    
    
    public class Line extends Shape{
    
    	public Line(int x1, int y1, int x2, int y2){
    		super(x1,y1,x2,y2);
    		
    	}
    	
    	public void setX1(int x1){
    		this.x1 = x1;
    	}
    	
    	public void setX2(int x2){
    		this.x2 = x2;
    	}
    	
    	public void setY1(int y1){
    		this.y1 = y1;
    	}
    	
    	public void setY2(int y2){
    		this.y2 = y2;
    	}
    	
    	public void paintComponent(Graphics g){
    				
    		super.paintComponent(g);
    		
    		g.setColor(Color.black);
    		
    		g.drawLine(x1,y1,x2,y2);	
    	}
    }
    Shape estende JComponent ma si limita a inizializzare le 4 coordinate

    thx per la risposta

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: [Java] Lavagna Condivisa

    Originariamente inviato da J-Hard
    il codice l'ho talmente tanto sporcato che alla fine son tornato al punto di partenza. te lo incollo ugualmente giusto per farti un'idea dello scheletro dell'applicazione.
    Beh, il codice non dice molto ..... è poco più di uno scheletro (quasi) vuoto.

    Originariamente inviato da J-Hard
    codice:
    public class Line extends Shape{
        [....]
    }
    Shape estende JComponent
    Pessima (davvero) idea "modellare" una linea (o altra forma) come un "componente".

    Definisci pure una tua gerarchia, ma non come componenti. Semplicemente come oggetti con delle proprietà. Magari partendo da una interfaccia che fa da base (es. Shape, sempre tua) che descrive cosa deve "saper" fare una forma.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    28
    ok allora modifico subito purtroppo son passato da poco a java e alla programmazione ad oggetti e sto avendo un bel pò di difficoltà nella modellazione del software.

    hai qualche idea sul come risolvere il mio problema?

  6. #6
    Originariamente inviato da J-Hard
    hai qualche idea sul come risolvere il mio problema?
    Per rappresentare le linee potresti usare istanze di questa classe Line2D. L'ho utilizzata in passato.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    28
    Originariamente inviato da VincenzoTheBest
    Per rappresentare le linee potresti usare istanze di questa classe Line2D. L'ho utilizzata in passato.
    grazie per la dritta purtroppo il mio problema è nel disegnare queste maledette linee (o chi per loro)...ogni volta che ne disegno una mi scompare se ne disegno una seconda ho capito che il problema sta nel repaint() perchè mi ridisegna tutta la lavagna, solo che non riesco a trovare una soluzione decente

  8. #8
    Originariamente inviato da J-Hard
    ogni volta che ne disegno una mi scompare se ne disegno una seconda ho capito che il problema sta nel repaint() perchè mi ridisegna tutta la lavagna, solo che non riesco a trovare una soluzione decente
    La soluzione è utilizzare una qualche struttura lineare nella quale salvare ogni linea.

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    28
    e se salvassi tutte le figure della lavagna in una lista o vettore? in modo tale che ad ogni chiamata al paintComponent (tramite repaint()) ridisegno tutte le figure ogni volta.
    potrebbe funzionare anche se è una soluzione rozzissima?

  10. #10
    Originariamente inviato da J-Hard
    e se salvassi tutte le figure della lavagna in una lista o vettore? in modo tale che ad ogni chiamata al paintComponent (tramite repaint()) ridisegno tutte le figure ogni volta.
    In pratica hai scritto in modo più esplicito ciò che ho scritto nel precedente post.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.