Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-07-2009, 14: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, 15: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, 15: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, 15: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 15:38.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 15: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 15:49.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 16: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, 16: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, 16: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, 16: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 16:18. Motivo: ho "lisciato"
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 16: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, 16: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, 16: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 16:29.
Cory è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2009, 16: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, 16: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, 16: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, 16: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, 16: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, 16: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, 16: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, 17: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


Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Blue Origin rinvia il secondo lancio del...
Nasce l'albo degli influencer 'rilevanti...
Il Digital Networks Act è stato r...
ASUS ROG ha lanciato due nuovi monitor d...
I nuovi iPhone 18 Pro potrebbero present...
Una parte dei Galaxy S26 avrà chi...
Amazon permetterà agli autori ind...
Il caso Zuckerberg a Palo Alto: una scuo...
Texas contro Roblox: il procuratore gene...
Offerte auto da urlo su Amazon: da CarPl...
Windows 11 26H1 in arrivo fra pochi mesi...
Un Black Friday continuo a rilascio lent...
Redmi Pad Pro da 12,1" 2560x2600 pi...
Tesla Roadster rinviata (di nuovo): ora ...
Il nuovo TV premium 2025 Samsung OLED 4K...
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: 04:21.


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