1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    septembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : septembre 2017
    Messages : 6
    Points : 6
    Points
    6

    Par défaut Duplication de boutons

    Bonjour,

    Je débute en Java et j'ai fait une petite calculatrice. J'ai 2 JPanels dans un JSplitPane.
    JPanel 1: écran: pas de boutons, repaint() fréquents
    JPanel 2: boutons: contient des boutons mais jamais repaint()

    Le soucis c'est que quand je clique sur les boutons du panel 2, je vois des boutons non cliquables apparaître dans le panel 1 :/
    De plus, la réactivité des boutons du panel du bas augmente avec le temps d'utilisation, j'ai l'impression qu'a chaque repaint les boutons sont construits dans les 2 panels....

    Pourquoi ?
    Svp j'ai besoin de votre aide, parce que ça réduit vraiment la réactivité des boutons après un certain nombre de clics x)

    Voici le code:
    (J'ai mis une ligne en commentaire dans Panneau.java (ligne 26) pour qu'on voie les boutons apparaître, sinon ils sont la mais instantanément cachés)

    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
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
     
    public class Main {
     
    	private static String currentNumber = "0";
    	private static String savedNumber = "";
    	private static String disp2 = "";
    	private static Fenetre fen = new Fenetre();
    	private static int operation = 0;
     
    	public static void main(String[] args) {
     
    		fen.setVisible(true);
     
    	}
     
    	public static void buttonClick(int buttonID) {
     
    		switch (buttonID) {
    			case -2:
    				reset();
    				break;
    			case -1:
    				removeNumber();
    				break;
    			case 10:
    				addVirgule();	
    				break;
    			case 20:
    				invertSign();
    				break;
    			case 100:
    				calculate();
    				break;
    			default:
    				if(buttonID >= 0 && buttonID <= 9)
    					addNumber(buttonID);
    				if(buttonID >= 11 && buttonID <= 14)
    					operation(buttonID);
    		}
     
    	}
     
    	private static void addNumber(int number) {
     
    		if(currentNumber != "0")
    			currentNumber += String.valueOf(number);
    		else
    			currentNumber = String.valueOf(number);
     
    		fen.updateDisp(currentNumber, disp2);
    	}
     
    	private static void removeNumber() {
     
    		if(currentNumber.length() == 1)
    			currentNumber = "0";
    		else
    			currentNumber = currentNumber.substring(0, currentNumber.length()-1);
     
    		fen.updateDisp(currentNumber, disp2);
    	}
     
    	private static void addVirgule() {
    		currentNumber += ".";
    		fen.updateDisp(currentNumber, disp2);
    	}
     
    	private static void operation(int id) {
     
    		disp2 = currentNumber;
    		savedNumber = currentNumber;
    		operation = id - 10;
     
    		switch (operation) {
    			case 1:
    				disp2 += " +";
    				break;
    			case 2:
    				disp2 += " *";
    				break;
    			case 3:
    				disp2 += " -";
    				break;
    			case 4:
    				disp2 += " /";
    				break;
    			default:;
    		}
     
    		currentNumber = "0";
    		fen.updateDisp(currentNumber, disp2);
     
    	}
     
    	private static void calculate() {
     
    		boolean error = false;
     
    		switch (operation) {
    			case 1:
    				currentNumber = String.valueOf(Double.valueOf(savedNumber) + Double.valueOf(currentNumber));
    				break;
    			case 2:
    				currentNumber = String.valueOf(Double.valueOf(savedNumber) * Double.valueOf(currentNumber));
    				break;
    			case 3:
    				currentNumber = String.valueOf(Double.valueOf(savedNumber) - Double.valueOf(currentNumber));
    				break;
    			case 4:
    				if(Double.valueOf(currentNumber) != 0)
    					currentNumber = String.valueOf(Double.valueOf(savedNumber) / Double.valueOf(currentNumber));
    				else {
    					fen.error("Division par zéro impossible !");
    					error = true;
    				}
    				break;
    			default:;
    		}
     
    		if(!error) {
    			savedNumber = "";
    			disp2 = "";
    			fen.updateDisp(currentNumber, "");
    		}
     
    	}
     
    	private static void reset() {
    		currentNumber = "0";
    		savedNumber = "";
    		disp2 = "";
    		fen.updateDisp("0", "");
    	}
     
    	private static void invertSign() {
     
    		if(currentNumber.charAt(0) == '-')
    			currentNumber = currentNumber.substring(1, currentNumber.length());
    		else
    			currentNumber = "-" + currentNumber;
     
    		fen.updateDisp(currentNumber, disp2);
    	}
     
    }
    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
     
    import java.awt.Container;
    import java.awt.GridLayout;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSplitPane;
     
    public class Fenetre extends JFrame {
     
    	private static final long serialVersionUID = 8164118974463460991L;
    	private Panneau pan = new Panneau();
     
    	public Fenetre() {	
     
    		this.setTitle("Calculatrice");
    		this.setSize(400, 500);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setResizable(false);
     
    		Container cont = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    		((JSplitPane) cont).setEnabled(false);
    		((JSplitPane) cont).setDividerLocation(80);
     
    		cont.add(pan);
    		cont.add(panneauBouttons());
     
    		this.getContentPane().add(cont);
     
    	}
     
    	private static JPanel panneauBouttons() {
     
    		JPanel p = new JPanel();
     
    		GridLayout gl = new GridLayout();
    		gl.setColumns(4);
    		gl.setRows(5);
    		p.setLayout(gl);
     
    		p.add(new Bouton(-10, ""));
    		p.add(new Bouton(20, "+/-"));
    		p.add(new Bouton(-2, "C"));
    		p.add(new Bouton(-1, "<"));
    		p.add(new Bouton(7, "7"));
    		p.add(new Bouton(8, "8"));
    		p.add(new Bouton(9, "9"));
    		p.add(new Bouton(11, "+"));
    		p.add(new Bouton(4, "4"));
    		p.add(new Bouton(5, "5"));
    		p.add(new Bouton(6, "6"));
    		p.add(new Bouton(12, "*"));
    		p.add(new Bouton(1, "1"));
    		p.add(new Bouton(2, "2"));
    		p.add(new Bouton(3, "3"));
    		p.add(new Bouton(13, "-"));
    		p.add(new Bouton(0, "0"));
    		p.add(new Bouton(10, "."));
    		p.add(new Bouton(100, "="));
    		p.add(new Bouton(14, "/"));
     
    		return p;
    	}
     
    	public void updateDisp(String newDisp, String disp2) {
    		pan.updateDisp(newDisp, disp2);
    	}
     
    	public void error(String message) {
    		pan.error(message);
    	}
     
    }
    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
     
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import javax.swing.JPanel;
     
    public class Panneau extends JPanel {
     
    	private static final long serialVersionUID = 3153962253715907216L;
    	private String display = new String();
    	private String display2 = new String();
    	Font Prim = new Font("Arial", Font.PLAIN, 16);
    	Font Sec = new Font("Arial", Font.PLAIN, 12);
     
    	public Panneau() {	
    	}
     
    	public void paintComponent(Graphics g) {
     
     
     
     
     
    		//g.clearRect(0, 0, 500, 100);
     
     
     
     
     
    		g.setFont(Prim);
    		g.setColor(Color.black);
    		g.drawString(display, 350 - (g.getFontMetrics().stringWidth(display)), 60);
     
    		g.setFont(Sec);
    		g.setColor(Color.gray);
    		g.drawString(display2, 300 - (g.getFontMetrics().stringWidth(display2)), 20);
     
    	}
     
    	public void updateDisp(String newDisp, String disp) {
    		this.display = newDisp;
    		this.display2 = disp;
    		this.repaint();
    	}
     
    	public void error(String message) {
    		this.display = message;
    		this.repaint();
    	}
     
    }
    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
     
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import javax.swing.JButton;
     
    public class Bouton extends JButton implements MouseListener {
     
    	private static final long serialVersionUID = -8525715718794492788L;
    	public int buttonID;
    	/*
    	 * -2: tout effacer
    	 * -1: effacer
    	 * 0 a 9: nombres
    	 * 10: .
    	 * 11: +
    	 * 12: *
    	 * 13: -
    	 * 14: /
    	 * 20: +/-
    	 * 100: =
    	 *  
    	 */
     
    	public Bouton(int id, String name) {
    		this.setText(name);
    		this.addMouseListener(this);
    	    this.buttonID = id;
    	}
     
    	public void mouseClicked(MouseEvent arg0) {
    		Main.buttonClick(this.buttonID);
    	}
     
    	public void mouseEntered(MouseEvent arg0) {
     
    	}
     
    	public void mouseExited(MouseEvent arg0) {
     
    	}
     
    	public void mousePressed(MouseEvent arg0) {
     
    	}
     
    	public void mouseReleased(MouseEvent arg0) {
     
    	}
     
    }
    Voila, dites moi si vous arrivez a reproduire le bug même si je ne pense pas être le seul chez qui ça arrive...
    J'obtiens ça:
    Nom : Calculette.gif
Affichages : 16
Taille : 233,6 Ko
    Les nombres ne s'affichent pas bien mais c'est normal, j'ai retiré la ligne qui vide l'écran avant de réécrire (pour qu'on voie le bug): ligne 24 sur Panneau.java


    Merci d'avance

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    août 2006
    Messages
    3 519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2006
    Messages : 3 519
    Points : 6 911
    Points
    6 911

    Par défaut

    Moui, le code est illisible et bizarrement organise, mais soit.

    Il te manque une appel au début du paintComponent du Jpanel ce qui résoudra déjà un problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	public void paintComponent(Graphics g) {
            // Ca ira mieux avec ceci je pense ;)
    		super.paintComponent(g);
     
    		g.setFont(Prim);
    		g.setColor(Color.black);
    		g.drawString(display, 350 - (g.getFontMetrics().stringWidth(display)), 60);
     
    		g.setFont(Sec);
    		g.setColor(Color.gray);
    		g.drawString(display2, 300 - (g.getFontMetrics().stringWidth(display2)), 20);
     
    	}
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    septembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : septembre 2017
    Messages : 6
    Points : 6
    Points
    6

    Par défaut

    OK merci.

    Désolé pour l'organisation, je suis débutant x)

    Ça a l'air de marcher, mais les boutons ne sont toujours pas réactifs c'est vraiment bizarre, quand je clique rapidement sur plusieurs boutons a la suite il a du mal a tous les prendre :/

    Je vais essayer de réorganiser tout ça

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/04/2014, 11h01
  2. duplication d'un bouton comprenant plusieurs calques
    Par methoscbl dans le forum Flash
    Réponses: 2
    Dernier message: 06/08/2006, 14h39
  3. Pop-up d'une dialog box a partir d'un bouton
    Par bobbyjack dans le forum MFC
    Réponses: 21
    Dernier message: 13/09/2005, 16h32
  4. Message 'Duplicate index entry'
    Par Poulou dans le forum Administration
    Réponses: 13
    Dernier message: 04/05/2004, 15h57
  5. Afficher/Masquer un bouton comme IE 6
    Par benj63 dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/07/2002, 14h12

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