Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
Recensione Borderlands 4, tra divertimento e problemi tecnici
Recensione Borderlands 4, tra divertimento e problemi tecnici
Gearbox Software rilancia la saga con Borderlands 4, ora disponibile su PS5, Xbox Series X|S e PC. Tra le novità spiccano nuove abilità di movimento, un pianeta inedito da esplorare e una campagna che lascia al giocatore piena libertà di approccio
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
NXTPAPER 60 Ultra è il primo smartphone con tecnologia NXTPAPER 4.0 per il display, un ampio IPS da 7,2 pollici. Con finitura anti-riflesso, processore MediaTek Dimensity 7400, fotocamera periscopica e modalità Max Ink per il detox digitale, NXTPAPER 60 Ultra punta a essere il riferimento tra gli smartphone pensati per il benessere degli occhi.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-07-2009, 13:56   #1
Cory
Member
 
L'Avatar di Cory
 
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
[Java] problema metodo paint(Graphics g)

Ho scritto quest'applicazione che, una volta schiacciato il bottone, permette di disegnare delle piccole X con colore casuale sul pannello, mandando ai JtextField X e Y le coordinate in cui si è cliccato sul pannello.
Tuttavia non capisco perchè non mi disegna le crocette sul pannello, che ho settato come opaco e su cui invoco la repaint(); (ho provato anche a mettere la validate(); prima, ma non cambia nullla)..non capisco cosa sbaglio...

Codice:
package pacchetto;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class Prova extends JFrame{

    public static void main(String [] args){

        JFrame x=new JFrame();
        x.setSize(new Dimension(400,400));
        x.setResizable(true);
        x.setContentPane(new Pannello());
        x.setDefaultCloseOperation(EXIT_ON_CLOSE);
        x.setVisible(true);
    }
}

public class Pannello extends JPanel{

    int red,green,blue,X,Y;
    Random generatore=new Random(System.currentTimeMillis()/27);
    JButton bottone;
    JLabel stato,x,y;
    JFormattedTextField uno,due;
    JPanel pane;

    public Pannello(){
        this.setBackground(Color.LIGHT_GRAY);
        this.setLayout(new GridBagLayout());
        GridBagConstraints c=new GridBagConstraints();

        bottone=new JButton("Cambia stato");
        bottone.addActionListener(new Abilita());
        c.weightx=1;
        c.fill=GridBagConstraints.HORIZONTAL;
        c.weightx=1;
        c.weighty=0;
        c.gridx=0;
        c.gridy=0;
        c.gridwidth=1;
        add(bottone,c);

        stato=new JLabel("");
        c.gridx=1;
        c.gridy=0;
        c.gridwidth=1;
        c.anchor=GridBagConstraints.CENTER;
        c.insets.left=5;
        add(stato,c);

        x=new JLabel("X=");
        c.gridx=2;
        c.gridy=0;
        c.anchor=GridBagConstraints.CENTER;
        c.gridwidth=1;
        c.weightx=1;
        c.weighty=0;
        c.insets.left=50;
        add(x,c);

        y=new JLabel("Y=");
        c.gridx=2;
        c.gridy=1;
        c.gridwidth=1;
        add(y,c);

        uno=new JFormattedTextField();
        c.gridx=3;
        c.gridy=0;
        c.gridwidth=1;
        c.insets.left=5;
        add(uno,c);

        due=new JFormattedTextField();
        c.gridx=3;
        c.gridy=1;
        c.gridwidth=1;
        add(due,c);

        pane=new JPanel();
        pane.setBackground(Color.WHITE);
        pane.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        pane.setOpaque(true);
        c.fill=GridBagConstraints.BOTH;
        c.gridx=0;
        c.gridy=2;
        c.gridwidth=4;
        c.gridheight=1;
        c.insets.top=5;
        c.weightx=1;
        c.weighty=1;
        add(pane,c);
    }

    class Abilita implements ActionListener{
        boolean isActive=false;

        public void actionPerformed(ActionEvent e) {

            if(isActive==false){
                stato.setText("ATTIVATO");
                isActive=true;
                pane.addMouseListener(new Disegno());                
            }
            else if(isActive==true){
                isActive=false;
                stato.setText("DISATTIVATO");
                pane.removeMouseListener(pane.getMouseListeners()[0]);
                uno.setText("");
                due.setText("");
            }
        }
    }

    class Disegno implements MouseListener{

        public void mouseClicked(MouseEvent e) {
           X=e.getX(); Y=e.getY();
           uno.setText(String.valueOf(X));
           due.setText(String.valueOf(Y));          
        }
        public void mousePressed(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}
    }

    public void paint(Graphics g){
        super.paint(g);
        green=generatore.nextInt(255)+1;
        red=generatore.nextInt(255)+1;
        blue=generatore.nextInt(255)+1;
        g.setColor(new Color(red,green,blue));
        g.drawLine(X-5, Y+5, X+5, Y-5);
        g.drawLine(X-5, Y-5, X+5, Y+5);        
        repaint();
        
    }
}
se qualcuno fosse in grado di aiutarmi...
Cory è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 14:06   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Scusami, ma che ci fa un metodo paint() che prende un Graphics e ci disegna sopra dentro la classe Disegno che altro non è se non l'implementazione di un MouseListener?

Forse volevi fare l'override di paintComponent() del JPanel in cui vuoi eseguire il rendering... il MouseListener al massimo ascolterà, appunto, gli eventi del mouse che ti interessano per estrarre informazioni utili ai fini del tuo rendering (coordinate evento click del mouse, per esempio).

Mi pare tu abbia ancora le idee poco chiare su certi concetti: ti rilinko questo otiimo e breve tutorial
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 14:18   #3
Cory
Member
 
L'Avatar di Cory
 
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
il tutorial che hai linkato non parla mica del custom graphics...

il metodo paint(Graphics g); viene invocato ogni volta che clicco sul pannello pane. poichè il metodo paint non va mai richiamato direttamente, invoco il repaint su pane (le X vanno disegnate solo all'interno del pannello pane)...

e infatti cliccando sul pannello, dopo averlo attivato, riesco a mandare le nformazioni sulle coordinate ai textfield. ma perchè non disegna la croce???

class Disegno implements MouseListener{

public void mouseClicked(MouseEvent e) {
X=e.getX(); Y=e.getY();
uno.setText(String.valueOf(X));
due.setText(String.valueOf(Y));
pane.repaint();
}

da quel che scrivi tu mi pare che non sia corretto usare il metodo paint, ma allora come si fa a disegnare??
Cory è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 14:34   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Cory Guarda i messaggi
il tutorial che hai linkato non parla mica del custom graphics...
Vero, però io intendevo che ci sono altre cose da sistemare, per esempio nel main() quando lanci l'interfaccia lo fai dal thread corrente; sarebbe bene (anzi bisognerebbe proprio, sempre e comunque) farlo dall'EDT e in quel tutorial è praticamente la prima cosa spiegata

Quote:
da quel che scrivi tu mi pare che non sia corretto usare il metodo paint, ma allora come si fa a disegnare??
Il fatto è che è sul JPanel che tu vuoi disegnare, ovvero su un componente grafico.

Un JPanel, in quanto componente grafico, estende JComponent, dal quale eredita il metodo paintComponent(Graphics g) che è il metodo che viene invocato durante il ciclo di rendering dei componenti Swing.

Quindi se tu definisci un tuo JPanel e vuoi renderizzare qualcosa sulla sua superficie devi fare l'ovveride di tale metodo, e definirne il corpo inserendo le tue operazioni di rendering (che tipicamente si fanno operando sul Graphics passato in ingresso).
Ci penserà poi il framework Swing a invocare paintComponet() ogni volta che riterrà neccessario aggiornare la grafica.

Tu puoi comunicare a Swing che ti interessa aggiornare la grafica del tal componente invocando il metodo repaint() sul componente specifico: sarà comunqe Swing a invocare dietro le quinte la paintComponent.

Ti posto i javadoc del metodo paintComponent della classe JComponent:
Quote:
protected void paintComponent(Graphics g)

Calls the UI delegate's paint method, if the UI delegate is non-null. We pass the delegate a copy of the Graphics object to protect the rest of the paint code from irrevocable changes (for example, Graphics.translate).

If you override this in a subclass you should not make permanent changes to the passed in Graphics. For example, you should not alter the clip Rectangle or modify the transform. If you need to do these operations you may find it easier to create a new Graphics from the passed in Graphics and manipulate it. Further, if you do not invoker super's implementation you must honor the opaque property, that is if this component is opaque, you must completely fill in the background in a non-opaque color. If you do not honor the opaque property you will likely see visual artifacts.

The passed in Graphics object might have a transform other than the identify transform installed on it. In this case, you might get unexpected results if you cumulatively apply another transform.

Parameters:
g - the Graphics object to protect
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 02-07-2009 alle 14:38.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 14:45   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
In pratica, dovresti sovvrascrivere il metodo paintComponet del JPanel sul quale disegni, con uno schema simile a questo:
Codice:
class MioPannelloDiRendering extends JPanel
{
    @Override
    protected void paintComponent(Graphics g)
    {
         super.paintComponent(g);
         // comandi personalizzati di rendering sul Graphics...
    }
}
Puoi leggerti qualcosa, se ti interessa:
- Painting in Swing(in italiano, slide di una dispensa universitaria)
- Painting in AWT e Swing(roba della Sun, in inglese, consigliata)
- Lesson: performing custom painting(tutorial della Sun, preso dal vasto The Really Big Index, in inglese, consigliato)
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 02-07-2009 alle 14:49.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:02   #6
Cory
Member
 
L'Avatar di Cory
 
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
ma quindi dovrei racchiudere pane in una classe, e specificare in essa il metodo paintComponent()?

del tipo

class Pane extends JPanel{

JPanel pane=new JPanel();

proteced void paintComponent(Graphics g){

blablabla;
}

}

e poi come lo aggiungo al pannello???

addComponent(new Pane()); ?
Cory è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:08   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
L'approccio che hai usato non è forse orotodosso ma, a parte due piccole incertezze, è tecnicamente corretto.

Le ragioni per cui non funziona sono due ma sono due piccole sviste.

La prima è che devi aggiungere il tuo ascoltatore di eventi Disegno al pannello che metti nel frame: la semplice dichiarazione non basta.

Il tuo metodo main diventa allora una cosa del genere:

Codice:
    public static void main(String [] args){
	Pannello p = new Pannello();
	p.addMouseListener(p.new Disegno());

        JFrame x=new JFrame();
        x.setSize(new Dimension(400,400));
        x.setResizable(true);
        x.setContentPane(p);
        x.setDefaultCloseOperation(EXIT_ON_CLOSE);
        x.setVisible(true);
    }
La seconda svista è la posizione dell'invocazione "repaint()". L'hai messa nel metodo paint() ma l'invocazione di repaint() causa a sua volta l'invocazione di repaint() quindi hai un ciclo ricorsivo infinito.

Togli repaint() dal metodo paint() e metti repaint() come ultima invocazione el metodo mouseClicked della classe Disegno.

E tutto funzionerà.

Per ragioni di concorrenza dovresti prendere quello che hai nel metodo main metterlo nel run() di un'istanza di Runnable e poi passare quel Runnable al metodo invokeLater di EventQueue ma questa è un'altra storia.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:11   #8
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Postrsti usare una classe anonima per pane, così:
Codice:
JPanel pane;
...
pane = new JPanel() 
{
    @Override protected void paintComponet(Graphics g);
    {
        super.paintComponet(g);
        // qui inserisci il tuo codice di rendering...
    }
};
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:15   #9
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
* edit
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 02-07-2009 alle 15:18. Motivo: ho "lisciato"
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:18   #10
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Come non detto, ho mancato la lettura di una parentesi nel codice... chiedo venia
@cory: scusa se ti ho fatto confusione.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:23   #11
Cory
Member
 
L'Avatar di Cory
 
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
ho seguito quanto detto da PGI-Bis

sul posizionamento del repaint(); ok, era una cosa che avevo già notato e corretto.
modificando il main come dici tu però non cambia nulla...in sostanza, nella figura che segue, non mi disegna le croci sul pannello bianco..

Cory è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:24   #12
Cory
Member
 
L'Avatar di Cory
 
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Come non detto, ho mancato la lettura di una parentesi nel codice... chiedo venia
@cory: scusa se ti ho fatto confusione.
figurati...più che altro mi sembrava una soluzione troppo complicata e cervellotica, anche considerando il modo in cui mi hanno insegnato a programmare

EDIT: magari non c'entra una tega, ma io ve lo dico lo stesso..uso Netbeans e la classe Prova è in un file e quella Pannello in un altro..

Ultima modifica di Cory : 02-07-2009 alle 15:29.
Cory è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:32   #13
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Questo è il main:

Codice:
    public static void main(String [] args){
	Pannello p = new Pannello();
	p.addMouseListener(p.new Disegno());

        JFrame x=new JFrame();
        x.setSize(new Dimension(400,400));
        x.setResizable(true);
        x.setContentPane(p);
        x.setDefaultCloseOperation(EXIT_ON_CLOSE);
        x.setVisible(true);
    }
questo è il paint:

Codice:
    public void paint(Graphics g){
        super.paint(g);
        green=generatore.nextInt(255)+1;
        red=generatore.nextInt(255)+1;
        blue=generatore.nextInt(255)+1;
        g.setColor(new Color(red,green,blue));
        g.drawLine(X-5, Y+5, X+5, Y-5);
        g.drawLine(X-5, Y-5, X+5, Y+5);
        //repaint();

    }
e questo il mouseClicked:

Codice:
        public void mouseClicked(MouseEvent e) {
           X=e.getX(); Y=e.getY();
           uno.setText(String.valueOf(X));
           due.setText(String.valueOf(Y));
	   repaint();
        }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:34   #14
Cory
Member
 
L'Avatar di Cory
 
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
ho apportato quella modifica al main ma non cambia nulla...
Cory è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:38   #15
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Non è possibile.

Questo è il codice completo del programma.

Codice:
package test;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class Prova extends JFrame{

    public static void main(String [] args){
	Pannello p = new Pannello();
	p.addMouseListener(p.new Disegno());

        JFrame x=new JFrame();
        x.setSize(new Dimension(400,400));
        x.setResizable(true);
        x.setContentPane(p);
        x.setDefaultCloseOperation(EXIT_ON_CLOSE);
        x.setVisible(true);
    }
}

class Pannello extends JPanel{

    int red,green,blue,X,Y;
    Random generatore=new Random(System.currentTimeMillis()/27);
    JButton bottone;
    JLabel stato,x,y;
    JFormattedTextField uno,due;
    JPanel pane;

    public Pannello(){
        this.setBackground(Color.LIGHT_GRAY);
        this.setLayout(new GridBagLayout());
        GridBagConstraints c=new GridBagConstraints();

        bottone=new JButton("Cambia stato");
        bottone.addActionListener(new Abilita());
        c.weightx=1;
        c.fill=GridBagConstraints.HORIZONTAL;
        c.weightx=1;
        c.weighty=0;
        c.gridx=0;
        c.gridy=0;
        c.gridwidth=1;
        add(bottone,c);

        stato=new JLabel("");
        c.gridx=1;
        c.gridy=0;
        c.gridwidth=1;
        c.anchor=GridBagConstraints.CENTER;
        c.insets.left=5;
        add(stato,c);

        x=new JLabel("X=");
        c.gridx=2;
        c.gridy=0;
        c.anchor=GridBagConstraints.CENTER;
        c.gridwidth=1;
        c.weightx=1;
        c.weighty=0;
        c.insets.left=50;
        add(x,c);

        y=new JLabel("Y=");
        c.gridx=2;
        c.gridy=1;
        c.gridwidth=1;
        add(y,c);

        uno=new JFormattedTextField();
        c.gridx=3;
        c.gridy=0;
        c.gridwidth=1;
        c.insets.left=5;
        add(uno,c);

        due=new JFormattedTextField();
        c.gridx=3;
        c.gridy=1;
        c.gridwidth=1;
        add(due,c);

        pane=new JPanel();
        pane.setBackground(Color.WHITE);
        pane.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        pane.setOpaque(true);
        c.fill=GridBagConstraints.BOTH;
        c.gridx=0;
        c.gridy=2;
        c.gridwidth=4;
        c.gridheight=1;
        c.insets.top=5;
        c.weightx=1;
        c.weighty=1;
        add(pane,c);
    }

    class Abilita implements ActionListener{
        boolean isActive=false;

        public void actionPerformed(ActionEvent e) {

            if(isActive==false){
                stato.setText("ATTIVATO");
                isActive=true;
                pane.addMouseListener(new Disegno());
            }
            else if(isActive==true){
                isActive=false;
                stato.setText("DISATTIVATO");
                pane.removeMouseListener(pane.getMouseListeners()[0]);
                uno.setText("");
                due.setText("");
            }
        }
    }

    class Disegno implements MouseListener{

        public void mouseClicked(MouseEvent e) {
           X=e.getX(); Y=e.getY();
           uno.setText(String.valueOf(X));
           due.setText(String.valueOf(Y));
	   repaint();
        }
        public void mousePressed(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}
    }

    public void paint(Graphics g){
        super.paint(g);
        green=generatore.nextInt(255)+1;
        red=generatore.nextInt(255)+1;
        blue=generatore.nextInt(255)+1;
        g.setColor(new Color(red,green,blue));
        g.drawLine(X-5, Y+5, X+5, Y-5);
        g.drawLine(X-5, Y-5, X+5, Y+5);
        //repaint();

    }
}
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:43   #16
Cory
Member
 
L'Avatar di Cory
 
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
eh oh..non va..
Cory è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:47   #17
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Se ridimensioni la finestra dopo aver fatto un po' di click compare la crocetta?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:49   #18
Cory
Member
 
L'Avatar di Cory
 
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
dopo aver cliccato a caso per un bel po', anche senza ridimensionare, m'è comparsa qualche X a fianco del bottone
Cory è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15:52   #19
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
incolla il codice che hai.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 16:01   #20
Cory
Member
 
L'Avatar di Cory
 
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
Codice:
package pacchetto;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class Prova extends JFrame{

    public static void main(String [] args){

            JFrame x=new JFrame();
            x.setSize(new Dimension(400,400));
            x.setResizable(true);
            x.setContentPane(new Pannello());
            x.setDefaultCloseOperation(EXIT_ON_CLOSE);
            x.setVisible(true);
            }
}

public class Pannello extends JPanel{

    int red,green,blue,X,Y;
    Random generatore=new Random(System.currentTimeMillis()/27);
    JButton bottone;
    JLabel stato,x,y;
    JFormattedTextField uno,due;
    JPanel pane;

    public Pannello(){
        this.setBackground(Color.LIGHT_GRAY);
        this.setLayout(new GridBagLayout());
        GridBagConstraints c=new GridBagConstraints();

        bottone=new JButton("Cambia stato");
        bottone.addActionListener(new Abilita());
        c.weightx=1;
        c.fill=GridBagConstraints.HORIZONTAL;
        c.weightx=1;
        c.weighty=0;
        c.gridx=0;
        c.gridy=0;
        c.gridwidth=1;
        add(bottone,c);

        stato=new JLabel("");
        c.gridx=1;
        c.gridy=0;
        c.gridwidth=1;
        c.anchor=GridBagConstraints.CENTER;
        c.insets.left=5;
        add(stato,c);

        x=new JLabel("X=");
        c.gridx=2;
        c.gridy=0;
        c.anchor=GridBagConstraints.CENTER;
        c.gridwidth=1;
        c.weightx=1;
        c.weighty=0;
        c.insets.left=50;
        add(x,c);

        y=new JLabel("Y=");
        c.gridx=2;
        c.gridy=1;
        c.gridwidth=1;
        add(y,c);

        uno=new JFormattedTextField();
        c.gridx=3;
        c.gridy=0;
        c.gridwidth=1;
        c.insets.left=5;
        add(uno,c);

        due=new JFormattedTextField();
        c.gridx=3;
        c.gridy=1;
        c.gridwidth=1;
        add(due,c);

        pane=new JPanel();
        pane.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        c.fill=GridBagConstraints.BOTH;
        c.gridx=0;
        c.gridy=2;
        c.gridwidth=4;
        c.gridheight=1;
        c.insets.top=5;
        c.insets.left=0;
        c.weightx=1;
        c.weighty=1;
        add(pane,c);
    }

    class Abilita implements ActionListener{
        boolean isActive=false;

        public void actionPerformed(ActionEvent e) {

            if(isActive==false){
                stato.setText("ATTIVATO");
                isActive=true;
                pane.addMouseListener(new Disegno());                
            }
            else if(isActive==true){
                isActive=false;
                stato.setText("DISATTIVATO");
                pane.removeMouseListener(pane.getMouseListeners()[0]);
                uno.setText("");
                due.setText("");
            }
        }
    }

    class Disegno implements MouseListener{

        public void mouseClicked(MouseEvent e) {
           X=e.getX(); Y=e.getY();
           uno.setText(String.valueOf(X));
           due.setText(String.valueOf(Y));
           repaint();
        }
        public void mousePressed(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}
    }

    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        green=generatore.nextInt(256)+1;
        red=generatore.nextInt(256)+1;
        blue=generatore.nextInt(256)+1;
        g.setColor(new Color(red,green,blue));
        g.drawLine(X-5, Y+5, X+5, Y-5);
        g.drawLine(X-5, Y-5, X+5, Y+5);             
    }    
}
lasciandolo così, mi disegna le X sul pannello in generale..nel senso che se attivo il JPanel e clicco in un dato punto (x,y) di pane mi disegna la X nel punto (x,y) del frame.
Allora ho provato a sostituire il repaint(); del MouseListener con pane.repaint(); ma

1. nel JPanel pane non disegna nulla, pur inviando le giuste coordinate ai textfield
2. a furia di cliccare a caso e per un bel po' di tempo mi spunta qualche X sulla parte sopra il pannello, senza nessuna logica precisa..
Cory è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
The Social Reckoning: il seguito di The ...
iPhone 16 si trova ora su Amazon a soli ...
Amazon fa a pezzi i prezzi dei monitor g...
Componenti hardware e periferiche PC a p...
Pianeta in crisi: 7 su 9 limiti vitali g...
Galaxy S25 FE con taglio di prezzo di 10...
4 robot aspirapolvere e 3 scope elettric...
Nuovissimi Xiaomi 15T e 15T Pro con tagl...
Le agenzie federali americane potranno u...
Smartphone pieghevoli sempre più ...
LG svela le Easy TV, una nuova gamma di ...
L'equipaggio della missione Shenzhou-20 ...
Possibili detriti spaziali del razzo cin...
Amazon distrugge i prezzi: TV OLED LG, i...
Trump studia dazi fino al 100% per sping...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:32.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v