IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Double Buffering Hardware -> c'est hard !


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Par défaut Double Buffering Hardware -> c'est hard !
    Bonjour à tous,

    voici mon 'tit problème, je suis en train de faire une interface graphique en utilisant le double buffering software et tout va nickel ! Sauf qu'à force de rajouter des composants, çà commence à ramer méchament... Et il faut pas !

    Je voulais donc essayer le double buffering hardware pour voir si çà arrangeait un peu les choses, et là, c'est le drame, çà marche pas !

    Ma fenêtre principale qui contient des boutons et des composants divers, ici un cadran (sorte de compte tours) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    public class JFenetre implements ActionListener {
     
    	JFrame f;
    	Container contentPane;
    	JButton start, quit, pause;
    	JGraphe graphe1, graphe2;
    	JCadran cadran1;
    	int hauteur,largeur;
    	int hauteur_Cadran, largeur_Cadran;
    	Font police_boutons;
     
     
    	public JFenetre(LectureCSV lect){
     
    		lectCSV = lect;
    		f = new JFrame();
    		f.addWindowListener(new java.awt.event.WindowAdapter() {
    	        public void windowClosing(java.awt.event.WindowEvent evt) {
    	        	System.out.println("exit");
    				System.exit(0);
    	        } 
    	} );
    		hauteur = 600;
    		largeur = 800;
     
    		if(largeur>=1000) police_boutons = new Font("Dialog", 1, 16); 
    		if(largeur>=800) police_boutons = new Font("Dialog", 1, 12); 
    		if(largeur<800) police_boutons = new Font("Dialog", 1, 8); 
     
    		largeur_Cadran = hauteur/4;
    		hauteur_Cadran = hauteur/4;
     
    		contentPane = f.getContentPane();
    		contentPane.setLayout(null);
    		f.setSize(largeur, hauteur);
    		f.setLocation(0, 0);
    		f.setTitle("TESTS IHM");
     
     
    		start = new JButton();
    		start.setFont(police_boutons);
    		start.setText("START");
    		start.setSize(largeur/10, hauteur/30);
    		start.setLocation((largeur/13), hauteur-(hauteur/9));
    		start.addActionListener((ActionListener) this);
    		contentPane.add(start);
     
     
    		quit = new JButton();
    		quit.setFont(police_boutons);
    		quit.setText("QUIT");
    		quit.setSize(largeur/10, hauteur/30);
    		quit.setLocation((largeur/5), hauteur-(hauteur/9));
    		quit.addActionListener((ActionListener) this);
    		contentPane.add(quit);
     
    		pause = new JButton();
    		pause.setFont(police_boutons);
    		pause.setText("PAUSE");
    		pause.setSize(largeur/10, hauteur/30);
    		pause.setLocation((largeur/3), hauteur-(hauteur/9));
    		pause.addActionListener((ActionListener) this);
    		contentPane.add(pause);
     
    		cadran1 = new JCadran(lectCSV.map.get("NUM1"),largeur_Cadran,hauteur_Cadran,lectCSV.map.periode_acqui,0, 30700);
    		cadran1.setLocation(largeur/2+20,0);
    		cadran1.setSize(largeur_Cadran,hauteur_Cadran);
    		cadran1.setVisible(true);
    		contentPane.add(cadran1);
    		new Thread(cadran1).start();
     
    		f.setVisible(true);
     
     
    	}
     
     
     
    	public void actionPerformed(final ActionEvent e) {
     
    		Thread t = new Thread(){
    		public void run() {
     
    		if( (e.getSource() == start) && (!lectCSV.reading) ){
    			System.out.println("START !!!");
    			lectCSV.reading = true;
    			lectCSV.run();
    		}
    		if(e.getSource() == pause){
    			if(lectCSV.reading ){
    				System.out.println("PAUSE");
    				lectCSV.reading = false;
    			}
    			else{
    				System.out.println("REPRISE");
    				lectCSV.reading = true;
    			}
    		}
    		if(e.getSource() == quit){
    			System.out.println("QUIT");
    			System.exit(0);
    		}
    	}
    };
    t.start();
    }
     
    }


    Ma classe Cadran, ici en double buffering software (version qui marche)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    public class JCadran extends Canvas implements Runnable{
     
    	Param param;
    	int largeur, hauteur;
    	Image image;
    	Graphics2D buffer;	
     
     
    	public JCadran(Param param,int largeur, int hauteur, int periode_acqui, double ValMin, double ValMax){
     
    		setBackground(Color.lightGray);
                   //des initialisations en masse
    	}
     
     
    	public void update(Graphics g){
    	      paint(g);
    	   }
     
     
    	public void paint( Graphics g ){
     
    		//création du buffer s'il n'existe pas
    		if(buffer==null){
    			image = createImage(largeur,hauteur);
    			buffer = (Graphics2D) image.getGraphics();
    		}
     
    		buffer.setColor( Color.lightGray );
    		buffer.fillRect( 0, 0, largeur, hauteur );
     
     
    		// Affichage des graduations
    		DecimalFormat f = new DecimalFormat();
    		f.setMaximumFractionDigits(3);
    		for(int i=0; i<=10; i++){
    			buffer.drawLine(X1[i], Y1[i], X2[i], Y2[i]);
    			buffer.drawString(f.format(ValMax-(i*Val_grad)), Xt[i], Yt[i]);
    		}
     
    		// buffer.drawPleinDeTrucs ...
     
    		g.drawImage(image, 0, 0, this);
    	}
     
     
     
     
    	public void run() {
    	while(true){
    	try {
    		repaint(); 
    		Thread.sleep( (long) (periode_acqui/1.5) );
    	} catch ( Exception e ) {} 
    	}
    }
    }

    Et enfin, ma tentative de double buffering hardware:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    public class JCadran extends JFrame implements Runnable{
    	
    	Param param;
    	int largeur, hauteur;
    	public BufferStrategy strategy ;
    	public Graphics2D buffer ;
    
    public JCadran(Param param,int largeur, int hauteur, int periode_acqui, double ValMin, double ValMax){
    	
    		setIgnoreRepaint(true);
    		createBufferStrategy(2);
    		strategy = getBufferStrategy();
    		buffer = (Graphics2D)strategy.getDrawGraphics() ;
    }
    
    public void aff(){
    		   
    				
    		buffer.setColor( Color.lightGray );
    		buffer.fillRect( 0, 0, largeur, hauteur );
    				
    		// Affichage des graduations
    		DecimalFormat f = new DecimalFormat();
    		f.setMaximumFractionDigits(3);
    
    		for(int i=0; i<=10; i++){
    			buffer.drawLine(X1[i], Y1[i], X2[i], Y2[i]);
    			buffer.drawString(f.format(ValMax-(i*Val_grad)), Xt[i], Yt[i]);
    		}
    
                      strategy.show();
    
    
    public void run() {
    	while(true){
    	try {
    	      aff(); 
    		Thread.sleep( (long) (periode_acqui/1.5) );
    	} catch ( Exception e ) {} 
    	}
    }
    }
    Et donc l'erreur que çà me renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Exception in thread "main" java.lang.IllegalStateException: Component must have a valid peer
    	at java.awt.Component$FlipBufferStrategy.createBuffers(Unknown Source)
    	at java.awt.Component$FlipBufferStrategy.<init>(Unknown Source)
    	at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Unknown Source)
    	at java.awt.Component.createBufferStrategy(Unknown Source)
    	at java.awt.Window.createBufferStrategy(Unknown Source)
    	at java.awt.Component.createBufferStrategy(Unknown Source)
    	at java.awt.Window.createBufferStrategy(Unknown Source)
    	at IHM.JCadran.<init>(JCadran.java:62)
    	at IHM.JFenetre.<init>(JFenetre.java:102)
    	at LectureCSV.Main.main(Main.java:14)

    Ok je sais, çà fait pas mal de code, mais j'ai essayé de simplifier au max en virant ce qui n'était pas essentiel...
    Sur le principe, çà à l'air tout con, on dirait que çà marche pareil que le softaware, mais en pratique, çà fait la journée que je galère dessus...

    C'est pourquoi un 'tit coup de pouce serait le bienvenu...

    Merci d'avance !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Par défaut
    Bah alors, y a personne pour me débloquer ?

    Quand on sait, çà doit être tout bête...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 38
    Par défaut
    Il me semble qu'en utilisant le double buffering hardware j'avais eu le même problème, que j'avais résolu en affichant la fenêtre au préalable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		setVisible(true);
    		createBufferStrategy(2);
    		strategy = getBufferStrategy();

Discussions similaires

  1. Exemple de Double Buffering Hardware
    Par narkotik dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 09/03/2011, 19h52
  2. Utiliser le double buffering hardware
    Par ilias20 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 12/06/2010, 23h50
  3. Réponses: 7
    Dernier message: 06/04/2009, 16h43
  4. [swing] double buffering hardware et composants
    Par xion luhnis dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 21/06/2007, 20h51
  5. [swing & AWT] double buffering hardware
    Par bidules dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 27/11/2005, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo