Langage Java : repaint()

[Résolu/Fermé]
Signaler
-
 Xeldal -
Bonjour,

Je dois créer un Tutorial pour un projet en java. Mon idée était de faire une seule fenêtre et d'incrémenter un compteur pour changer de panel à chaque fois. J'ai donc 2 boutons :
Précédent et Suivant. Précédent n'est pas présent quand le compteur est à zéro et Suivant n'est pas présent quand le compteur est au max. J'aimerai avec un repaint afficher ou non les boutons grâce au compteur qui s'incrémente dans les écouteurs. Les écouteurs marchent puisque le bouton suivant change de couleur quand je clique dessus mais je n'arrive pas à afficher le bouton précédent quand je clique sur le bouton suivant. Le bouton précédent s'affiche quand je met le compteur à 1.

package Objectif3D;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Tutorial3D extends JFrame{
JPanel Bas,Haut;
JPanel[] Gauche ,Droite;
JButton Precedent, Suivant;
int i=0, max=3, min=0;
public Tutorial3D(){
initComponents();
}
private void initComponents(){
this.setTitle("Tutorial Java 3D");
this.setSize(1000, 800);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new GridLayout(2,1));
Haut = new JPanel();
Haut.setLayout(new GridLayout(1,2));
Haut.setSize(100,100);
Bas = new JPanel();
Bas.setLayout(new GridLayout(1,2));
Bas.setSize(100,20);
Precedent = new JButton("Précédent");
Precedent.setActionCommand("Precedent");
Precedent.setSize(50,20);
Suivant = new JButton("Suivant");
Suivant.setSize(50,20);
if (i == min){
Precedent.setVisible(false);
}else{
Precedent.setVisible(true);
}
if (i == max){
Suivant.setVisible(false);
}else{
Suivant.setVisible(true);
}
Bas.add(Precedent);
Bas.add(Suivant);
Suivant.addActionListener(new btnDeplacement());
Precedent.addActionListener(new btnDeplacement());
this.add(Haut);
this.add(Bas);
}
class btnDeplacement implements ActionListener {
public void actionPerformed(ActionEvent evt) {
if (evt.getActionCommand().equals("Suivant")) {
i++;
if (i == 1){
Suivant.setForeground(Color.cyan);
}else if(i==2){
Suivant.setForeground(Color.yellow);
}else if(i==3){
Suivant.setForeground(Color.green);
}
repaint();
}else if (evt.getActionCommand().equals("Precedent")){
i--;
Precedent.setForeground(Color.cyan);
repaint();
}
}
}
public static void main(String[] args) {
Tutorial3D FenTuto = new Tutorial3D();
FenTuto.setVisible(true);
}
}

6 réponses

Messages postés
258
Date d'inscription
dimanche 11 octobre 2009
Statut
Membre
Dernière intervention
5 janvier 2012
32
Yep

ben je suis toujours pas sur d'avoir compris à 100% ce que tu attends mais si ton but c'est de faire disparaitre précédent lors du clic sur précédent lorsque le compteur arrive à 1 tu fais :

if (evt.getActionCommand().equals("Precedent")){ 
if(i > 1){ 
i--; 
precedent.setVisible(true);
}
else{ precedent.setVisible(false); }
} 


ou un truc dans le genre... Qu'en penses tu ?

Toopa
Pour le bouton ça marcherais mais au final je voudrais créer un tableau de Panel qui dépendrais de la variable "i" et quand je i augmente avec le clique la fenêtre fait un refresh et affiche le panel qui correspond.

Par exemple :
Panel[0] : Photo / Panel[1] Texte. Quand je lance l'appli je vois la photo et quand je clique sur le bouton, le "i" augmente, la fenêtre se refresh et il m'affiche le texte au lieu de la photo.
Messages postés
258
Date d'inscription
dimanche 11 octobre 2009
Statut
Membre
Dernière intervention
5 janvier 2012
32
Certes, mais ton JPanel (contenant l'image que tu veux afficher) n'a rien à voir avec les boutons. Il est un composant de ta Frame, tout comme tes boutons.

Donc ton refresh en fait c'est juste de remplacer un JPanel par un autre dans ta JFrame.
Messages postés
258
Date d'inscription
dimanche 11 octobre 2009
Statut
Membre
Dernière intervention
5 janvier 2012
32
Ou même mieux. Tu peux juste modifier le contenu de ton JPanel en lui mettant une image contenue dans un tableau.
Messages postés
258
Date d'inscription
dimanche 11 octobre 2009
Statut
Membre
Dernière intervention
5 janvier 2012
32
En fait j'ai regardé ton programme et je l'ai un peu bricolé.. Dis moi ce que tu en penses et si tu veux des explications :

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Tutorial3D extends JFrame implements ActionListener{ 
	
	private static final long serialVersionUID = 1L;
	JPanel Bas,Haut; 
	JPanel[] Gauche ,Droite; 
	JButton Precedent, Suivant; 
	int i=0, max=3, min=0; 
	
	public Tutorial3D(){ 
		initComponents(); 
	} 

	private void initComponents(){ 
		
		setTitle("Tutorial Java 3D"); 
		setSize(1000, 800); 
		setLocationRelativeTo(null); 
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		setLayout(new GridLayout(2,1)); 
		
		Haut = new JPanel(); 
		Haut.setLayout(new GridLayout(1,2)); 
		Haut.setSize(100,100); 
		
		Bas = new JPanel(); 
		Bas.setLayout(new GridLayout(1,2)); 
		Bas.setSize(100,20);
		
		Precedent = new JButton("Précédent");
		Precedent.addActionListener(this);
		Precedent.setSize(50,20);
		Precedent.setEnabled(false);
		Bas.add(Precedent);
				
		Suivant = new JButton("Suivant"); 
		Suivant.addActionListener(this);
		Suivant.setSize(50,20); 
		Bas.add(Suivant);

		add(Haut);
		add(Bas); 	
	} 
		
	public void actionPerformed(ActionEvent e) { 
			
		if (e.getSource() == Suivant) { 
			
			if(i<3)
				i++;
			
			System.out.println("Valeur de i : "+i);
			Precedent.setEnabled(true);		// tu ne peux pas atteindre i=0 en cliquant sur suivant
			
			switch(i){ // donc pas de "case 0" à gérer... ici
				case 1 :
					Suivant.setForeground(Color.cyan);
					break;
					
				case 2 :
					Suivant.setForeground(Color.yellow);
					break;
					
				case 3 :
					Suivant.setForeground(Color.green);
					Suivant.setEnabled(false);	// désactivation du bouton suivant en fin de compteur
					break;
			}
		}
		else if (e.getSource() == Precedent){ 
			if(i>0)	
				i--;
			
			System.out.println("Valeur de i : "+i);
			Suivant.setEnabled(true);		// tu ne peux pas atteindre i=3 en cliquant sur précédent
			
			switch(i){ // donc pas de "case 3" à gérer... ici
				case 1 :
					Suivant.setForeground(Color.cyan);
					break;
					
				case 2 :
					Suivant.setForeground(Color.yellow);
					break;
					
				case 0 :
					Suivant.setForeground(Color.green);
					Precedent.setEnabled(false);	// désactivation du bouton suivant en fin de compteur
					break;
			} 
		} 
	} 
		
	public static void main(String[] args) { 
			Tutorial3D FenTuto = new Tutorial3D(); 
			FenTuto.setVisible(true); 
	}
}
Bah tu contournes un peu ce que je veux faire. Ce que tu viens de me link je sais le faire. Mon problème c'est que je veux faire un refresh de la fenêtre et que j'y arrive pas. J'ai du mal m'expliquer : / . Au final mon problème c'est que je compte afficher dans ma fenêtre des choses en fonction de la variable "i" pour éviter de créer plein de fenêtre avec un lien entre elle ou de mettre 10 Panel non visiblement pendant que j'en affiche un.
Messages postés
258
Date d'inscription
dimanche 11 octobre 2009
Statut
Membre
Dernière intervention
5 janvier 2012
32
Salut.

Pourquoi repaint() ?
Il y a bien plus facile. Non ?

Toopa
C'est ce qu'on m'a apprit à l'IUT. Il existe autre chose que repaint() pour rafraîchir une page?