Visualizzazione dei risultati da 1 a 8 su 8

Hybrid View

  1. #1
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Per poter far sì che gli oggetti vengano disegnati devi ridefinire uno tra i due metodi: paint o paintComponent. Meglio il secondo.
    Ad ogni modo, i due metodi hanno la seguente firma:

    paint(Graphics g)
    paintComponent(Graphics g)


    Non puoi "inventarti" una nuova firma... se lo fai, stai definendo un nuovo metodo "custom" di cui nessuno sa nulla e che nessuno invocherà (se non lo fai tu, che ne ha conoscenza).

    Nel thread fai 2 chiamate: movimento() e repaint(). Il primo sposta gli oggetti. Il secondo richiama il "refresh" della videata. Il framework Swing effettua questo "refresh", richiamando il metodo paintComponent() (che a sua volta richiama il metodo paint() ). Ma, ovviamente, richiama quello giusto (cioè quello con la firma imposta dalla sua API).

    Nel tuo codice hai definito un metodo paint() che riceve un array di oggetti Graphics2D (che non ha alcun senso: il graphics è uno soltanto, quello del pannello in cui andranno disegnati gli oggetti)... e questo metodo non viene invocato da nessuno.

    Quindi, quello che va fatto, è ridefinire correttamente il metodo paint() o paintComponent(), che hanno la firma che ho esposto sopra.


    Ciao.
    Ultima modifica di LeleFT; 12-11-2015 a 12:00
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  2. #2
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Per poter far sì che gli oggetti vengano disegnati devi ridefinire uno tra i due metodi: paint o paintComponent. Meglio il secondo.
    Ad ogni modo, i due metodi hanno la seguente firma:

    paint(Graphics g)
    paintComponent(Graphics g)


    Non puoi "inventarti" una nuova firma... se lo fai, stai definendo un nuovo metodo "custom" di cui nessuno sa nulla e che nessuno invocherà (se non lo fai tu, che ne ha conoscenza).

    Nel thread fai 2 chiamate: movimento() e repaint(). Il primo sposta gli oggetti. Il secondo richiama il "refresh" della videata. Il framework Swing effettua questo "refresh", richiamando il metodo paintComponent() (che a sua volta richiama il metodo paint() ). Ma, ovviamente, richiama quello giusto (cioè quello con la firma imposta dalla sua API).

    Nel tuo codice hai definito un metodo paint() che riceve un array di oggetti Graphics2D (che non ha alcun senso: il graphics è uno soltanto, quello del pannello in cui andranno disegnati gli oggetti)... e questo metodo non viene invocato da nessuno.

    Quindi, quello che va fatto, è ridefinire correttamente il metodo paint() o paintComponent(), che hanno la firma che ho esposto sopra.


    Ciao.
    Ti giuro sto diventando matto! Anzitutto ti ringrazio perché sono diversi giorni che cerco di trovare una soluzione al problema. Ho ridefinito come mi hai detto il metodo paint:

    In creaOggetti:
    //Ho usato come da te suggerito la firma paintComponent
    @Override
    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d=(Graphics2D) g;
    for(int i=0;i<MAX_OGGETTI; i++) cerchio[i].disegna(g2d);

    }


    Classe oggetto:
    //Metodo che richiamo in creaOggetti con il paintComponent:
    public void disegna(Graphics2D g2) {
    g2.setColor(this.colore);
    g2.fillOval(x, y, WIDTH, HEIGHT);
    }


    Ma nulla non va! In console mi restituisce il seguente errore:
    codice:
    Inserisci l'asse X di partenza dell'oggetto -> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    	at oggetto.creaOggetti.paintComponent(creaOggetti.java:65)
    	at javax.swing.JComponent.paint(Unknown Source)
    	at javax.swing.JComponent.paintChildren(Unknown Source)
    	at javax.swing.JComponent.paint(Unknown Source)
    	at javax.swing.JComponent.paintChildren(Unknown Source)
    	at javax.swing.JComponent.paint(Unknown Source)
    	at javax.swing.JLayeredPane.paint(Unknown Source)
    	at javax.swing.JComponent.paintChildren(Unknown Source)
    	at javax.swing.JComponent.paintToOffscreen(Unknown Source)
    	at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
    	at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
    	at javax.swing.RepaintManager.paint(Unknown Source)
    	at javax.swing.JComponent.paint(Unknown Source)
    	at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
    etcetc
    In particolare in questa riga:
    codice:
     for(int i=0;i<MAX_OGGETTI; i++) cerchio[i].disegna(g2d);
    Spero di poter risolvere...
    Ultima modifica di StefanoLisi; 12-11-2015 a 15:05

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 © 2026 vBulletin Solutions, Inc. All rights reserved.