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

2D Java Discussion :

Dessin 2D avec Java


Sujet :

2D Java

  1. #1
    Membre habitué Avatar de Arislas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2015
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 116
    Points : 170
    Points
    170
    Par défaut Dessin 2D avec Java
    Bonjour ^^ , je revient encore vous embêter avec mes problèmes aujourd'hui.

    Je voudrais savoir qu'elle est la façon la plus ne simple en java de dessiner en 2D. Dessin qui changera dynamiquement par rapport à des cotes entrées par l'utilisateur


    J'ai utiliser le tutoriel avec le JCanvas et IDrawable pour le faire mais je suis tomber sur quelques problèmes :

    - le clear du JCanvas ne fonctionne pas correctement car il n'efface que les dix premiers pixels en haut et à droite du JCanvas, le reste reste dessiné.
    - une partie de l'interface du formulaire se retrouve afficher sur le JCanvas, sans aucune raison apparente.

    Un petit screen pour mieux expliquer :

    Nom : Sans titre.png
Affichages : 632
Taille : 124,9 Ko


    Je viens aussi me rendre compte que si je fait une capture d'écran ou que je change de focus et que je revient sur l'application, le JCanvas se remet comme il devrait jusqu'au moment ou j'écrit une nouvelle cote.


    Si vous voulez plus d'informations sur le code et autres, demandez ! ^^

    En attente de votre aide .

  2. #2
    Membre habitué Avatar de Arislas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2015
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 116
    Points : 170
    Points
    170
    Par défaut
    Voila le code qui a 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
    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
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTabbedPane;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.event.CaretEvent;
    import javax.swing.event.CaretListener;
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
     
     
    public class WindowDebit extends JFrame implements ActionListener {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1;
     
    	//Initialisation globale des composants de la fenêtre
    	JPanel panPrincipal = new JPanel();
    	JPanel panDessin = new JPanel();
    	JCanvas panFenetre = new JCanvas();
    	JPanel panOptionsGeneral = new JPanel();
    	JPanel panOptionsAvance =new JPanel();
    	JPanel panDebit = new JPanel();
     
    	JTabbedPane tabOptions = new JTabbedPane();
     
    	JLabel hauteur = new JLabel("Hauteur Fenêtre : ");
    	JLabel largeur = new JLabel("Largeur Fenêtre : ");
    	JLabel epaisseur = new JLabel("Epaisseur Fenêtre : ");
     
    	JTextField jtf1 = new JTextField();
    	JTextField jtf2 = new JTextField();
    	JTextField jtf3 = new JTextField();
     
    	JTextLimited JustNumber1 = new JTextLimited();
    	JTextLimited JustNumber2 = new JTextLimited();
    	JTextLimited JustNumber3 = new JTextLimited();
     
    	IDrawable rect;
     
    	//Initialisation de quelques variables globales
    	int rHauteur = 0;
    	int rLargeur = 0;
    	int rEpaisseur = 0;
     
    	public WindowDebit() {
     
    		//Initialisation de la fenêtre et de ses composants personnels
    		this.setTitle("Nouveau Débit");
    		this.setLocation(0,0);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		//Ajout d'un JMenuBar modifié
    		MenuBar menubar = new MenuBar(this);
    		this.setJMenuBar(menubar);
     
    		//Ajout des panels et du JCanvas sur la JFrame
    		panDessin.add(panFenetre);
    		panPrincipal.setLayout(null);
    		panPrincipal.setBackground(Color.gray);
    		panPrincipal.add(tabOptions);
    		panPrincipal.add(panDebit);
    		panPrincipal.add(panDessin);
    		this.add(panPrincipal);		
     
    		//Gestion de la taille de la fenêtre
    		this.setBounds(0,0,1600,860);
    		this.setResizable(false);
     
    		//Affichage de la fenêtre
    		this.setVisible(true);
     
    		//Gestion des placements des composants sur les JPanels
    		gestionPanelFenetre();
    		gestionFormulaireOptionGeneral();
    		gestionPanelOption();
    		gestionPanelDebit();
     
    	}
     
    	public void gestionPanelFenetre(){
    		//Gestion du panel qui contiendra la JCanvas
    		panDessin.setBounds(10, 10, panPrincipal.getWidth()/2, panPrincipal.getHeight()- 50);
    		panDessin.setBackground(Color.white);
    		panDessin.setLayout(null);
    		//Gestion du JCanvas
    		panFenetre.setBounds(10, 10, panPrincipal.getWidth()/2, panPrincipal.getHeight()- 50);
    		panFenetre.setLayout(null);
     
    	}		
     
    	public void gestionPanelOption(){
     
    		//Positionnement des composants du formulaire des options générales
    		gestionTabOptionsGénérales();
     
    		panOptionsAvance.setBackground(Color.yellow);
     
    		//Gestion du JTabbedPane
    		tabOptions.setBounds(panPrincipal.getWidth()/2 + 20, 10, panPrincipal.getWidth()/ 2 - 30 , panPrincipal.getHeight()/2 - 20);
    		tabOptions.add("Options Génerales", panOptionsGeneral);
    		tabOptions.add("Options Avancées", panOptionsAvance);
    	}
     
    	public void gestionPanelDebit(){
    		panDebit.setBounds(panPrincipal.getWidth()/2 + 20, panPrincipal.getHeight()/2 , panPrincipal.getWidth()/ 2 - 30, panPrincipal.getHeight()/2 - 40);
    		panDebit.setBackground(Color.green);
    	}
     
    	public void gestionFormulaireOptionGeneral(){
     
    	}
     
    	public void gestionTabOptionsGénérales(){
    		//On empêche la saisie de caractère autre que des chiffres
    		jtf1.setDocument(JustNumber1);
    		jtf2.setDocument(JustNumber2);
    		jtf3.setDocument(JustNumber3);
     
    		//On s'occupe du dynamisme des JTextFields pour le dessin
    		gestionDynamiqueTextField();
     
    		//Gestion des éléments du formulaire des options générales
    		panOptionsGeneral.setLayout(null);
    		hauteur.setBounds(20, 0, 120, 50 );
    		panOptionsGeneral.add(hauteur);
    		largeur.setBounds(20, 60, 120, 50 );
    		panOptionsGeneral.add(largeur);
    		epaisseur.setBounds(20, 120, 120, 50 );
    		panOptionsGeneral.add(epaisseur);
    		jtf1.setBounds(150, 16, 150, 20);
    		panOptionsGeneral.add(jtf1);
    		jtf2.setBounds(150, 76, 150, 20);
    		panOptionsGeneral.add(jtf2);
    		jtf3.setBounds(150, 136, 150, 20);
    		panOptionsGeneral.add(jtf3);
    	}
     
    	public void gestionDynamiqueTextField(){
     
     
    		Runnable doCaret = new Runnable(){
    			@Override
    			public void run() {
    				//Le caretListener permet d'actualiser le dessin à chaque changement dans les JTextFields
    				CaretListener caretupdate = new CaretListener() {
    		            public void caretUpdate(CaretEvent e) {
    		                if(e.getSource() == jtf1 && !jtf1.getText().isEmpty())
    		                	//On met les valeurs des JTextField dans les variables globales
    		                	rHauteur = Integer.parseInt(jtf1.getText());
    		                else if(e.getSource() == jtf2 && !jtf2.getText().isEmpty())
    		                	rLargeur = Integer.parseInt(jtf2.getText());
    		                else if(e.getSource() == jtf3 && !jtf3.getText().isEmpty())
    		                	rEpaisseur = Integer.parseInt(jtf3.getText());
    		                //Gestion des JTextFields vides
    		                if(e.getSource() == jtf1 && jtf1.getText().isEmpty())
    		                	jtf1.setText("0");
    		                else if(e.getSource() == jtf2 && jtf2.getText().isEmpty())
    		                	jtf2.setText("0");
    		                else if(e.getSource() == jtf3 && jtf3.getText().isEmpty())
    		                	jtf3.setText("0");
    		                //On dessine sur le JCanvas
    		                gestionDessinFenetre();
    		            }
    				};
    				//Ajout des CaretListener sur les JTextFields
    			    jtf1.addCaretListener(caretupdate);
    			    jtf2.addCaretListener(caretupdate);
    		    	jtf3.addCaretListener(caretupdate);		
    			}	
    	};
        SwingUtilities.invokeLater(doCaret);
    }
     
    	public void gestionDessinFenetre(){
    		if(rHauteur != 0 && rLargeur != 0 && rEpaisseur != 0)
    		{
    			rect = new RectangleDrawable(Color.blue, new Point(10,10), new Dimension(rHauteur,rLargeur));
    			panFenetre.addDrawable(rect);
    		}	
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent arg0) {
     
    	}
     
    }

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,
    Citation Envoyé par Arislas Voir le message
    J'ai utiliser le tutoriel avec le JCanvas et IDrawable pour le faire mais je suis tomber sur quelques problèmes :

    - le clear du JCanvas ne fonctionne pas correctement car il n'efface que les dix premiers pixels en haut et à droite du JCanvas, le reste reste dessiné.
    - une partie de l'interface du formulaire se retrouve afficher sur le JCanvas, sans aucune raison apparente.
    Je ne sais pas ce que c'est JCanvas : ce n'est pas standard. Quand tu fais référence à une bibliothèque qui ne fait pas partie du JDK, il faut indiquer le nom de la bibliothèque, ou l'URL du site où tu la chargée. Même si c'est depuis un tutoriel Développez (je suppose que c'est ça : http://duj.developpez.com/tutoriels/java/dessin/intro/)

    Si une partie de l'interface du formulaire se retrouve affichée sur le JCanvas, c'est que cette classe bidouille le contexte graphique de la mauvaise manière, ou que tu l'utilises mal. Ceci à cause du recyclage du contexte graphique.
    Je ne vois rien dans le JCanvas du tutoriel qui pourrait expliquer ça.

    Par contre, j'ai l'impression, vue vite fait, que tu enregistres plusieurs caretListener (étrange, pourquoi des CaretListeners et pas plutôt des DocumentListener ?)) : ceci doit en conséquence appeler la méthode gestionDessinFenetre à chaque fois que le curseur bouge dans les textfields, donc générer plein de redessin : cependant, ça n'explique pas pourquoi on a des scories dans le contexte graphique.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre habitué Avatar de Arislas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2015
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 116
    Points : 170
    Points
    170
    Par défaut
    Il est vrai, je parlais du tutoriel : http://duj.developpez.com/tutoriels/java/dessin/intro/.


    Pour le fait que ça doit toucher au contexte graphique de la mauvaise manière, je suis d'accord avec toi. Du coup, pour les scories, ils disparaissent si je fait une action sur le fenêtre, comme l'iconifier puis l'a rouvrir. Du coup je ne sais vraiment pas d'ou ils viennent ...

    Mais pour les caretListener j'ai un peu modifié le code depuis que je l'ai posté, il contient des fonctions non fini mais le principal y est :

    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
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTabbedPane;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.event.CaretEvent;
    import javax.swing.event.CaretListener;
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import java.io.File;
    import java.util.ArrayList;
     
     
     
    public class WindowDebit extends JFrame implements ActionListener {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1;
     
    	//Initialisation globale des composants de la fenêtre
    	JPanel panPrincipal = new JPanel();
    	JPanel panDessin = new JPanel();
    	JCanvas panFenetre = new JCanvas();
    	JPanel panOptionsGeneral = new JPanel();
    	JPanel panOptionsAvance =new JPanel();
    	JPanel panDebit = new JPanel();
     
    	JTabbedPane tabOptions = new JTabbedPane();
     
    	JLabel hauteur = new JLabel("Hauteur Fenêtre : ");
    	JLabel largeur = new JLabel("Largeur Fenêtre : ");
    	JLabel epaisseur = new JLabel("Epaisseur Fenêtre : ");
     
    	JTextField jtf1 = new JTextField();
    	JTextField jtf2 = new JTextField();
    	JTextField jtf3 = new JTextField();
     
    	JTextLimited JustNumber1 = new JTextLimited();
    	JTextLimited JustNumber2 = new JTextLimited();
    	JTextLimited JustNumber3 = new JTextLimited();
     
    	IDrawable rect;
     
    	JButton validerFenetre = new JButton("Lancer calcul débit");
    	JButton nouveauDebit = new JButton("Enregistrer sur une nouvelle feuille de débit");
    	JButton ajoutDebit = new JButton("Ajouter à une autre feuille de débit");
     
    	//Initialisation de quelques variables globales
    	int rHauteur = 0;
    	int rLargeur = 0;
    	int rEpaisseur = 0;
     
    	public WindowDebit() {
     
    		//Initialisation de la fenêtre et de ses composants personnels
    		this.setTitle("Nouveau Débit");
    		this.setLocation(0,0);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		//Ajout d'un JMenuBar modifié
    		MenuBar menubar = new MenuBar(this);
    		this.setJMenuBar(menubar);
     
    		//Ajout des panels et du JCanvas sur la JFrame
    		gestionPanelPrincipal();
    		this.add(panPrincipal);		
     
    		//Gestion de la taille de la fenêtre
    		this.setBounds(0,0,1600,860);
    		this.setResizable(false);
     
    		//Affichage de la fenêtre
    		this.setVisible(true);
     
    		//Gestion des placements des composants sur les JPanels
     
    		gestionPanelFenetre();
    		gestionFormulaireOptionGeneral();
    		gestionPanelOption();
    		gestionPanelDebit();
     
    	}
     
     
    	public void gestionPanelPrincipal(){
     
    		validerFenetre.setBounds(658, 772, 150 , 35);
    		validerFenetre.addActionListener(this);
    		nouveauDebit.setBounds(1390 , 772, 200, 35);
    		nouveauDebit.addActionListener(this);
     
    		panDessin.add(panFenetre);
    		panPrincipal.setLayout(null);
    		panPrincipal.setBackground(Color.gray);
    		panPrincipal.add(tabOptions);
    		panPrincipal.add(panDebit);
    		panPrincipal.add(panDessin);
    		panPrincipal.add(validerFenetre);
    		panPrincipal.add(nouveauDebit);
    	}
     
    	public void gestionPanelFenetre(){
    		//Gestion du panel qui contiendra la JCanvas
    		panDessin.setBounds(10, 10, panPrincipal.getWidth()/2, panPrincipal.getHeight()- 20);
    		panDessin.setBackground(Color.white);
    		panDessin.setLayout(null);
    		//Gestion du JCanvas
    		panFenetre.setBounds(10, 10, panPrincipal.getWidth()/2, panPrincipal.getHeight()- 20);
    		panFenetre.setLayout(null);
    	}		
     
    	public void gestionPanelOption(){
    		//Positionnement des composants du formulaire des options générales
    		gestionTabOptionsGénérales();
     
    		panOptionsAvance.setBackground(Color.yellow);
     
    		//Gestion du JTabbedPane
    		tabOptions.setBounds(panPrincipal.getWidth()/2 + 20, 10, panPrincipal.getWidth()/ 2 - 30 , panPrincipal.getHeight()/2 - 20);
    		tabOptions.add("Options Génerales", panOptionsGeneral);
    		tabOptions.add("Options Avancées", panOptionsAvance);
    	}
     
    	public void gestionPanelDebit(){
    		panDebit.setBounds(panPrincipal.getWidth()/2 + 20, panPrincipal.getHeight()/2 , panPrincipal.getWidth()/ 2 - 30, panPrincipal.getHeight()/2 - 40);
    		panDebit.setBackground(Color.green);
    	}
     
    	public void gestionFormulaireOptionGeneral(){
     
    	}
     
    	public void gestionTabOptionsGénérales(){
    		//On empêche la saisie de caractère autre que des chiffres
    		jtf1.setDocument(JustNumber1);
    		jtf2.setDocument(JustNumber2);
    		jtf3.setDocument(JustNumber3);
     
    		//On s'occupe du dynamisme des JTextFields pour le dessin
    		gestionDynamiqueTextField();
     
    		//Gestion des éléments du formulaire des options générales
    		panOptionsGeneral.setLayout(null);
    		hauteur.setBounds(20, 0, 120, 50 );
    		panOptionsGeneral.add(hauteur);
    		largeur.setBounds(20, 60, 120, 50 );
    		panOptionsGeneral.add(largeur);
    		epaisseur.setBounds(20, 120, 120, 50 );
    		panOptionsGeneral.add(epaisseur);
    		jtf1.setBounds(150, 16, 150, 20);
    		panOptionsGeneral.add(jtf1);
    		jtf2.setBounds(150, 76, 150, 20);
    		panOptionsGeneral.add(jtf2);
    		jtf3.setBounds(150, 136, 150, 20);
    		panOptionsGeneral.add(jtf3);
    	}
     
    	public void gestionDynamiqueTextField(){
     
    		Runnable doCaret = new Runnable(){
    			@Override
    			public void run() {
    				//Le caretListener permet d'actualiser le dessin à chaque changement dans les JTextFields
    				CaretListener caretupdate = new CaretListener() {
    		            public void caretUpdate(CaretEvent e) {
    		                if(e.getSource() == jtf1 && !jtf1.getText().isEmpty())
    		                	//On met les valeurs des JTextField dans les variables globales
    		                	rHauteur = Integer.parseInt(jtf1.getText());
    		                else if(e.getSource() == jtf2 && !jtf2.getText().isEmpty())
    		                	rLargeur = Integer.parseInt(jtf2.getText());
    		                else if(e.getSource() == jtf3 && !jtf3.getText().isEmpty())
    		                	rEpaisseur = Integer.parseInt(jtf3.getText());
    		                //On dessine sur le JCanvas
    		                gestionDessinFenetre();
    		            }
    				};
     
    				//Création du FocusListener pour gérer les JTextField vide
    				FocusListener focus = new FocusListener() {
     
    					@Override
    					public void focusLost(FocusEvent e) {
    						if(((JTextField) e.getSource()).getText().isEmpty())
    							((JTextField) e.getSource()).setText("0");
    					}
     
    					@Override
    					public void focusGained(FocusEvent e) {
    					}
    				};
     
    				//Ajout des Listener sur les JTextFields
    			    jtf1.addCaretListener(caretupdate);
    			    jtf2.addCaretListener(caretupdate);
    		    	jtf3.addCaretListener(caretupdate);	
    		    	jtf1.addFocusListener(focus);
    		    	jtf2.addFocusListener(focus);
    		    	jtf3.addFocusListener(focus);
    			}	
    	};
        SwingUtilities.invokeLater(doCaret);
    }
     
    	public void gestionDessinFenetre(){
    		if(rHauteur != 0 && rLargeur != 0 && rEpaisseur != 0)
    		{
    			Runnable doDraw = new Runnable() {
    				 @Override
                     public void run() {
    //					 panFenetre.removeDrawable(rect);
    					 panFenetre.clear();
    					 rect = new RectangleDrawable(Color.blue, new Point(10,10), new Dimension(rHauteur,rLargeur));
    					 panFenetre.addDrawable(rect);
    				 }
    			};
    			SwingUtilities.invokeLater(doDraw);
    		}	
    	}
     
    	public void calculDebit(){
     
    	}
     
    	public File CalculDebitComplet(){
    		return null;
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent arg0) {
    			if(arg0.getSource() == validerFenetre)
    				calculDebit();
    			if(arg0.getSource() == nouveauDebit){
    				File file = CalculDebitComplet();
    				SaveFile save = new SaveFile(file, this);
    			}
    	}
     
    }
    Je suis d'avis à mettre des DocumentListener, j'y avait penser mais je ne l'avait pas mis en place à cause du fait que ça m'avais l'air gros par rapport à ce que je voulais, mais maintenant ça me parait plutôt bien.

    Pour les scories, je doute aussi que ce soit du au CaretListener.

    Je ferais les modifications du programme pour les DocumentListener demain, je n'aurais plus accès au programme ce soir.

    Par contre il faut toujours trouver comment résoudre ces scories...

    Pour aider, je vais mettre en pièce jointes le programme.

    Pour vous permettre de voir si vous avez aussi des scories ou si cela vient de mon PC.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre habitué Avatar de Arislas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2015
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 116
    Points : 170
    Points
    170
    Par défaut
    Salut,

    Je voudrais savoir, comment tu programmerais les documentListener, pourqu'ils fonctionnent comme mes cartListener.

    Je n'arrive pas à retrouver le JTextField qui déclenche l'event.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    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
    jtf1.getDocument().addDocumentListener(new DocumentListener() {
     
       @Override
       public void removeUpdate(DocumentEvent e) {
       }
     
       @Override
       public void insertUpdate(DocumentEvent e) {
       }
     
       @Override
       public void changedUpdate(DocumentEvent e) {
       }
     
    });
    A noter, qu'il n'est pas possible de modifier le content du document lui-même dans ces évenements. Pour pouvoir le faire, il faudra utiliser un DocumentFilter,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ((AbstractDocument)jtf1.getDocument()).setDocumentFilter(new DocumentFilter() {
    				// ici rédéfinir les méthodes nécessaire	
    				});
    C'est d'ailleurs plutôt comme ça que tu auras dû implémenter ton JTextField uniquement numérique (filtre au cours de la saisie les caractères qui ne sont pas des chiffres), plutôt que de rédéfinir le document (et aussi utiliser un JFormattedTextField).



    PS. ton problème d'affichage est dû au fait qu'il manque le super.paint() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void paint(Graphics g) {
    		super.paint(g);
    		for (Iterator<IDrawable> iter = drawables.iterator(); iter.hasNext();) {
    			IDrawable d = (IDrawable) iter.next();
    			d.draw(g);	
    		}
    	}
    En effet, pour des raisons d'optimisation, le context graphique (l'instance de Graphics) est recyclé : il est utilisé pour générer l'affichage de tout les composants. La méthode paint() est chargée de nettoyer l'affichage dès le début pour le composant courant : supprimer l'appel du code standard de paint() supprime donc le code chargé de ce nettoyage, et, donc, on y voit ce qui a été dessiné précedemment.

    En fait, le mieux aurait été de redéfinir paintComponent() plutôt que paint().
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre habitué Avatar de Arislas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2015
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 116
    Points : 170
    Points
    170
    Par défaut
    Citation Envoyé par joel.drigo Voir le message

    PS. ton problème d'affichage est dû au fait qu'il manque le super.paint() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void paint(Graphics g) {
    		super.paint(g);
    		for (Iterator<IDrawable> iter = drawables.iterator(); iter.hasNext();) {
    			IDrawable d = (IDrawable) iter.next();
    			d.draw(g);	
    		}
    	}
    En effet, pour des raisons d'optimisation, le context graphique (l'instance de Graphics) est recyclé : il est utilisé pour générer l'affichage de tout les composants. La méthode paint() est chargée de nettoyer l'affichage dès le début pour le composant courant : supprimer l'appel du code standard de paint() supprime donc le code chargé de ce nettoyage, et, donc, on y voit ce qui a été dessiné précedemment.

    En fait, le mieux aurait été de redéfinir paintComponent() plutôt que paint().
    Super, merci , sa fait 3 jours que je bloque sur ce problème graphique ! Génial! Merci encore !

    Du coup j'essaie de mettre en place le documentListener, et quand ce sera fait je mettrait le sujet en résolu.

  8. #8
    Membre habitué Avatar de Arislas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2015
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 116
    Points : 170
    Points
    170
    Par défaut
    Je viens de penser à quelque chose, ton code :

    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
     
    jtf1.getDocument().addDocumentListener(new DocumentListener() {
     
       @Override
       public void removeUpdate(DocumentEvent e) {
       }
     
       @Override
       public void insertUpdate(DocumentEvent e) {
       }
     
       @Override
       public void changedUpdate(DocumentEvent e) {
       }
     
    });

    Il faut que je le réécrive pour chaque JTextField que je mettrait en place, ce qui fera un certains nombre assez gros. Il n'y aurait pas moyen de le faire pour qu'il récupère le JTextField modifié et applique les changement sur celui-ci. En ayant qu'un seul DocumentListener, comme je l'avais fait avec mes CaretListener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    				CaretListener caretupdate = new CaretListener() {
    		            public void caretUpdate(CaretEvent e) {
    		                if(e.getSource() == jtf1 && !jtf1.getText().isEmpty())
    		                	//On met les valeurs des JTextField dans les variables globales
    		                	rHauteur = Integer.parseInt(jtf1.getText());
    		                else if(e.getSource() == jtf2 && !jtf2.getText().isEmpty())
    		                	rLargeur = Integer.parseInt(jtf2.getText());
    		                else if(e.getSource() == jtf3 && !jtf3.getText().isEmpty())
    		                	rEpaisseur = Integer.parseInt(jtf3.getText());
    		                //On dessine sur le JCanvas
    		                gestionDessinFenetre();
    		            }
    				};

    Parce que du coup je pourrais changer les valuer de mes variable de hauteur, largeur, epaisseur, à chaque fois, mais ce n'est pas très optimisé ...

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Tu peux te faire une classe interne, ou locale, et utiliser la redéfinition pour faire la partie spécifique : ainsi, pas de duplication de code.

    En inner class :
    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
    public abstract class FieldUpdateListener implements DocumentListener {
     
    	public FieldUpdateListener() {
    	}
     
    	@Override
    	public void removeUpdate(DocumentEvent e) {
    		update(e.getDocument());
    	}
     
    	@Override
    	public void insertUpdate(DocumentEvent e) {
    		update(e.getDocument());
    	}
     
    	@Override
    	public void changedUpdate(DocumentEvent e) {
    		update(e.getDocument());
    	}
     
    	private void update(Document document) {
    		try {
    			String text = document.getText(0, document.getLength());
    			if ( !text.isEmpty() ) {
    				setValue(Integer.parseInt(text);
    				gestionDessinFenetre();
    			}
    		} catch (BadLocationException e) {
    		}
    	}
     
            protected abstract void setValue(int value);
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    jtf1.getDocument().addDocumentListener(new MyFieldUpdateListener() {
            protected void setValue(int value) {
                rHauteur=value;
            }
    });
    Ou par exemple, en Java 8 :

    Classe normale (pas interne) réutilisable
    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
    public class FieldUpdateListener<R> implements DocumentListener {
     
    	private Function<String, R> function;
     
    	public FieldUpdateListener(Function<String, R> function) {
    		this.function=function;
    	}
     
    	@Override
    	public void removeUpdate(DocumentEvent e) {
    		update(e.getDocument());
    	}
     
    	@Override
    	public void insertUpdate(DocumentEvent e) {
    		update(e.getDocument());
    	}
     
    	@Override
    	public void changedUpdate(DocumentEvent e) {
    		update(e.getDocument());
    	}
     
    	private void update(Document document) {
    		try {
    			String text = document.getText(0, document.getLength());
    			if ( !text.isEmpty() ) {
    				function.apply(text);
    				update();
    			}
    		} catch (BadLocationException e) {
    		}
    	}
     
    	protected void update() {
    	}
     
    }
    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
     
    // classe locale à ta méthode gestionDynamiqueTextField()
    class MyFieldUpdateListener extends FieldUpdateListener<Integer> {
     
        public MyFieldUpdateListener(Function<Integer, Integer> function) {
             super( t-> {
    	 return function.apply(Integer.parseInt(t));	
           } );
     
       }
     
       @Override
       protected void update() {
            gestionDessinFenetre();
       }
     
    }
     
    //jtf1.addCaretListener(caretupdate);
    jtf1.getDocument().addDocumentListener(new MyFieldUpdateListener(v-> rHauteur = v));
    //jtf2.addCaretListener(caretupdate);
    jtf2.getDocument().addDocumentListener(new MyFieldUpdateListener(v-> rLargeur = v));
    //jtf3.addCaretListener(caretupdate);	
    jtf3.getDocument().addDocumentListener(new MyFieldUpdateListener(v-> rEpaisseur = v));
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #10
    Membre habitué Avatar de Arislas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2015
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 116
    Points : 170
    Points
    170
    Par défaut
    Bonne idée je n'avais pas penser à sortir le documentListener en tant que nouvelle class ^^ . Du coup ça ma l'air plus simple de récupérer la valeur du champs. Et comme je suis en Java 7
    , je vais rester la première version.

    PS : J'avais hors contexte , j'ai lu qu'il y avait moyen d'avoir une zone de réponse à la discussion rapide, C'est-à-dire , qu'il ne faut pas ouvrir une nouvelle page pour répondre à la discussion.

    Vu que je n'ai pas cette zone de réponse , je me demandais si il faut l'activer ou si c'est n'ai pas normal qu'elle n'apparaisse pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment peut-on dessiner avec Java Swing ?
    Par mounaboug dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 06/03/2012, 19h15
  2. dessiner des arbres avec java
    Par manelisg dans le forum 2D
    Réponses: 13
    Dernier message: 09/04/2009, 16h29
  3. dessiner des cercles sur une image avec java
    Par inès83 dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 04/05/2008, 17h34
  4. Dessiner à l'écran avec Java hors d'une application
    Par BlackHawk10 dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 17/12/2007, 21h02
  5. Dessin vectoriel avec Java
    Par Rivages dans le forum 2D
    Réponses: 2
    Dernier message: 27/11/2006, 23h18

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