tracé fantôme d'un bouton dans une fenêtre graphique
2 réponses
Jean-Marc Vanel
J'ai une hiérarchie très simple de Component:
- contentPane avec BorderLayout
- JButton au Nord
- JPanel au centre sur lequel je trace du graphisme dans un thread à moi
Je regarde pourquoi il y a un tracé fantôme du bouton dans la fenêtre graphique.
Ce n'est pas un vrai bouton car en faisant un "dump" de
toute la hérarchie des composants AWT/Swing et on ne voit qu'un seul bouton.
J'emploie les grands moyens: je mets un point d'arrêt dans
AbstractButton.paintBorder()
Je vois 2 piles d'appels; apparemment c'est la 2ème qui est en trop.
COMMENT FAIRE POUR LA SUPPRIMER?
Pour les curieux, le source complet est ici:
http://cvs.sourceforge.net/viewcvs.py/ecolosim/src/ecolosim/simu/apps/MultipleModelsApp.java?rev=1.1.1.1&view=markup
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Bruno Nogent
Est-ce que tes appels a l'interface graphique se font bien dans le Thread de l'interface graphique ?
"Jean-Marc Vanel" wrote in message news:bueecg$coc$
J'ai une hiérarchie très simple de Component: - contentPane avec BorderLayout - JButton au Nord - JPanel au centre sur lequel je trace du graphisme dans un thread à moi
Je regarde pourquoi il y a un tracé fantôme du bouton dans la fenêtre graphique.
Ce n'est pas un vrai bouton car en faisant un "dump" de toute la hérarchie des composants AWT/Swing et on ne voit qu'un seul bouton.
J'emploie les grands moyens: je mets un point d'arrêt dans AbstractButton.paintBorder() Je vois 2 piles d'appels; apparemment c'est la 2ème qui est en trop. COMMENT FAIRE POUR LA SUPPRIMER?
Thread [AWT-EventQueue-0] (Suspended (breakpoint at line 1235 in AbstractButton))
Est-ce que tes appels a l'interface graphique se font bien dans le Thread de
l'interface graphique ?
"Jean-Marc Vanel" <jmvanel@free.fr> wrote in message
news:bueecg$coc$1@news-reader2.wanadoo.fr...
J'ai une hiérarchie très simple de Component:
- contentPane avec BorderLayout
- JButton au Nord
- JPanel au centre sur lequel je trace du graphisme dans un thread à moi
Je regarde pourquoi il y a un tracé fantôme du bouton dans la fenêtre
graphique.
Ce n'est pas un vrai bouton car en faisant un "dump" de
toute la hérarchie des composants AWT/Swing et on ne voit qu'un seul
bouton.
J'emploie les grands moyens: je mets un point d'arrêt dans
AbstractButton.paintBorder()
Je vois 2 piles d'appels; apparemment c'est la 2ème qui est en trop.
COMMENT FAIRE POUR LA SUPPRIMER?
Thread [AWT-EventQueue-0] (Suspended (breakpoint at line 1235 in
AbstractButton))
Est-ce que tes appels a l'interface graphique se font bien dans le Thread de l'interface graphique ?
"Jean-Marc Vanel" wrote in message news:bueecg$coc$
J'ai une hiérarchie très simple de Component: - contentPane avec BorderLayout - JButton au Nord - JPanel au centre sur lequel je trace du graphisme dans un thread à moi
Je regarde pourquoi il y a un tracé fantôme du bouton dans la fenêtre graphique.
Ce n'est pas un vrai bouton car en faisant un "dump" de toute la hérarchie des composants AWT/Swing et on ne voit qu'un seul bouton.
J'emploie les grands moyens: je mets un point d'arrêt dans AbstractButton.paintBorder() Je vois 2 piles d'appels; apparemment c'est la 2ème qui est en trop. COMMENT FAIRE POUR LA SUPPRIMER?
Thread [AWT-EventQueue-0] (Suspended (breakpoint at line 1235 in AbstractButton))
Est-ce que tes appels a l'interface graphique se font bien dans le Thread de l'interface graphique ?
J'ai essayé; ça "marche" en ce sens que je n'ai plus le tracé fantôme du bouton. Mais le Thread des évènements graphiques (AWT-eventQueue-0) ne donne plus du tout la main à l'utilisateur. Et ce, alors que j'y ai inséré un : Thread.sleep(30); qui suffit bien dans la version actuelle, pas belle mais qui marche. Il faut bien comprendre que mon dessin graphique est la visualisation en temps réel d'une simulation qui dure aussi longtemps que l'utilisateur le veut et qui prend presque 100% du CPU.
Dans le tutorial Java de Sun (Threads and Swing): http://java.sun.com/docs/books/tutorial/uiswing/overview/threads.html on trouve ceci: Two JComponent methods are safe to call from any thread: repaint and revalidate. These methods queue requests to be executed on the event-dispatching thread.
J'utilise donc repaint().
Je viens de trouver un article assez détaillé que je vais lire: http://java.sun.com/products/jfc/tsc/articles/painting/index.html
Thread t = new Thread(this, "mise à jour bestiaux"); t.start(); }
/** Ajoute dans le panneau donné la visualisation de la simulation; * on peut donc utiliser ceci dans une autre fenêtre et une autre application. */ public void addVisualizationPanel(Container contentPane) { realTimePanel_ = new Panel(); contentPane.setLayout( new BorderLayout() ); contentPane.add(realTimePanel_, BorderLayout.CENTER );
JButton but = new JButton("Arrêter/relancer simulation"); contentPane.add( but, BorderLayout.NORTH ); }
/** Ce Thread met à jour la visualisation de la simulation en appelant (indirectement) * {@link Panel.paintComponent()} * @see java.lang.Runnable#run() */ public void run() { while ( true ) { if ( realTimePanel_ != null ) realTimePanel_.repaint(); try { Thread.sleep(30); } catch (InterruptedException e) { System.exit(0); } } }
/** Cette classe met à jour la visualisation de la simulation */ class Panel extends JPanel { protected void paintComponent(Graphics g) { int x = (int) (Math.random() * tailleX_ ); int y = (int) (Math.random() * tailleY_ ); g.drawOval (x,y, 4, 4); } } }
Bruno Nogent wrote:
Est-ce que tes appels a l'interface graphique se font bien dans le Thread de
l'interface graphique ?
J'ai essayé; ça "marche" en ce sens que je n'ai plus le tracé fantôme du bouton.
Mais le Thread des évènements graphiques (AWT-eventQueue-0) ne donne plus du
tout la main à l'utilisateur. Et ce, alors que j'y ai inséré un :
Thread.sleep(30);
qui suffit bien dans la version actuelle, pas belle mais qui marche.
Il faut bien comprendre que mon dessin graphique est la visualisation en temps
réel d'une simulation qui dure aussi longtemps que l'utilisateur le veut et qui
prend presque 100% du CPU.
Dans le tutorial Java de Sun (Threads and Swing):
http://java.sun.com/docs/books/tutorial/uiswing/overview/threads.html
on trouve ceci:
Two JComponent methods are safe to call from any thread: repaint and revalidate.
These methods queue requests to be executed on the event-dispatching thread.
J'utilise donc repaint().
Je viens de trouver un article assez détaillé que je vais lire:
http://java.sun.com/products/jfc/tsc/articles/painting/index.html
Thread t = new Thread(this, "mise à jour bestiaux");
t.start();
}
/** Ajoute dans le panneau donné la visualisation de la simulation;
* on peut donc utiliser ceci dans une autre fenêtre et une autre application. */
public void addVisualizationPanel(Container contentPane) {
realTimePanel_ = new Panel();
contentPane.setLayout( new BorderLayout() );
contentPane.add(realTimePanel_, BorderLayout.CENTER );
JButton but = new JButton("Arrêter/relancer simulation");
contentPane.add( but, BorderLayout.NORTH );
}
/** Ce Thread met à jour la visualisation de la simulation en appelant
(indirectement)
* {@link Panel.paintComponent()}
* @see java.lang.Runnable#run()
*/
public void run() {
while ( true ) {
if ( realTimePanel_ != null )
realTimePanel_.repaint();
try {
Thread.sleep(30);
} catch (InterruptedException e) { System.exit(0); }
}
}
/** Cette classe met à jour la visualisation de la simulation */
class Panel extends JPanel {
protected void paintComponent(Graphics g) {
int x = (int) (Math.random() * tailleX_ );
int y = (int) (Math.random() * tailleY_ );
g.drawOval (x,y, 4, 4);
}
}
}
Est-ce que tes appels a l'interface graphique se font bien dans le Thread de l'interface graphique ?
J'ai essayé; ça "marche" en ce sens que je n'ai plus le tracé fantôme du bouton. Mais le Thread des évènements graphiques (AWT-eventQueue-0) ne donne plus du tout la main à l'utilisateur. Et ce, alors que j'y ai inséré un : Thread.sleep(30); qui suffit bien dans la version actuelle, pas belle mais qui marche. Il faut bien comprendre que mon dessin graphique est la visualisation en temps réel d'une simulation qui dure aussi longtemps que l'utilisateur le veut et qui prend presque 100% du CPU.
Dans le tutorial Java de Sun (Threads and Swing): http://java.sun.com/docs/books/tutorial/uiswing/overview/threads.html on trouve ceci: Two JComponent methods are safe to call from any thread: repaint and revalidate. These methods queue requests to be executed on the event-dispatching thread.
J'utilise donc repaint().
Je viens de trouver un article assez détaillé que je vais lire: http://java.sun.com/products/jfc/tsc/articles/painting/index.html
Thread t = new Thread(this, "mise à jour bestiaux"); t.start(); }
/** Ajoute dans le panneau donné la visualisation de la simulation; * on peut donc utiliser ceci dans une autre fenêtre et une autre application. */ public void addVisualizationPanel(Container contentPane) { realTimePanel_ = new Panel(); contentPane.setLayout( new BorderLayout() ); contentPane.add(realTimePanel_, BorderLayout.CENTER );
JButton but = new JButton("Arrêter/relancer simulation"); contentPane.add( but, BorderLayout.NORTH ); }
/** Ce Thread met à jour la visualisation de la simulation en appelant (indirectement) * {@link Panel.paintComponent()} * @see java.lang.Runnable#run() */ public void run() { while ( true ) { if ( realTimePanel_ != null ) realTimePanel_.repaint(); try { Thread.sleep(30); } catch (InterruptedException e) { System.exit(0); } } }
/** Cette classe met à jour la visualisation de la simulation */ class Panel extends JPanel { protected void paintComponent(Graphics g) { int x = (int) (Math.random() * tailleX_ ); int y = (int) (Math.random() * tailleY_ ); g.drawOval (x,y, 4, 4); } } }