Partage
  • Partager sur Facebook
  • Partager sur Twitter

JTextField et DocumentListener

Sujet résolu
    25 janvier 2023 à 19:40:57

    Bonjour,

    je suis actuellement entrain de développer mon premier interface graphique avec java swing. J'aimerais insérer du texte dans mes JtextField (txtField1, txtField2 et txtField3) au fur et à mesure que je saisi du texte dans le premier JTextFied (txtField1) et vice-versa

    J'ai donc ajouté un documentlistener à tous mes JTextField . Le problème est que, cela me génère une exception.

    J'aimerais que vous m'aidiez à lever cette exception: " Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification "


    Merci

    private JPanel CreateCalculZone1(){
    		JPanel CalculZone1 = new JPanel(new FlowLayout(FlowLayout.RIGHT, 15, 15));
    
    		JLabel DecimalLabel = new JLabel("Decimal : ");
    		DecimalLabel.setForeground(Color.WHITE);
    		DecimalLabel.setFont(new Font("Serif", Font.BOLD, 14));
    		CalculZone1.setBackground(Color.DARK_GRAY);
    		txtField1.setBackground(Color.DARK_GRAY);
    		txtField1.setForeground(Color.WHITE);
    		txtField1.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.WHITE));
    		txtField1.setFont(new Font("Serif", Font.BOLD, 14));
    		txtField1.setPreferredSize(new Dimension(320, 40));
    
    		txtField1.getDocument().addDocumentListener(new DocumentListener() {
    			
    			public void insertUpdate(DocumentEvent e) { txtField1Calcul(txtField1.getText() , getformatchoice()); };
    			public void removeUpdate(DocumentEvent e) { txtField1Calcul(txtField1.getText() , getformatchoice()); };
    			public void changedUpdate(DocumentEvent e) { txtField1Calcul(txtField1.getText() , getformatchoice()); };
    
    			public void txtField1Calcul(String text, String selectedItem){ 
    				
    				if(selectedItem == "Notation Naturelle"){
    					try{
    						if(text.isEmpty()){
    							txtField2.setText(""); 
    							txtField3.setText("");
    							txtField4.setText("");
    						}
    						else if(text.equals("-")){
    							return;
    						}
    						else{
    							// Conversion: text (String) -> InttxtField1Content (Décimal)
    							InttxtField1Content = Integer.parseInt(text); 
    							
    							if(InttxtField1Content >= 0){
    								System.out.println(("\tAppelle de txtField2 par txtField1Calcul"));
    								txtField2.setText(Integer.toBinaryString(InttxtField1Content)); 
    								System.out.println(("\tAppelle de txtField3 par txtField1Calcul"));
    								txtField3.setText(Integer.toOctalString(InttxtField1Content));
    								System.out.println(("\tAppelle de txtField4 par txtField1Calcul"));
    								txtField4.setText(Integer.toHexString(InttxtField1Content));
    							}
    							else{
    								txtField2.setText("-" + Integer.toBinaryString((-1)*InttxtField1Content)); 
    								txtField3.setText("-" + Integer.toOctalString((-1)*InttxtField1Content));
    								txtField4.setText("-" + Integer.toHexString((-1)*InttxtField1Content));
    							}
    						}
    					}
    					catch (NumberFormatException e1)	{
    						if(text.isEmpty()){
    							txtField2.setText(""); 
    							txtField3.setText("");
    							txtField4.setText("");
    						}
    						else if(text.equals("-")){
    							return;
    						}
    						else{
    							if(InttxtField1Content >= 0){
    								txtField2.setText(Integer.toBinaryString(InttxtField1Content)); 
    								txtField3.setText(Integer.toOctalString(InttxtField1Content));
    								txtField4.setText(Integer.toHexString(InttxtField1Content));
    							}
    							else{
    								txtField2.setText("-" + Integer.toBinaryString((-1)*InttxtField1Content)); 
    								txtField3.setText("-" + Integer.toOctalString((-1)*InttxtField1Content));
    								txtField4.setText("-" + Integer.toHexString((-1)*InttxtField1Content));
    							}
    						}
    					}
    				}
    				
    			}
    
    		});
    		
    		CalculZone1.add(DecimalLabel);
    		CalculZone1.add(txtField1);
    
    		return CalculZone1;
    	}
    	private JPanel CreateCalculZone2(){
    		JPanel CalculZone2 = new JPanel(new FlowLayout(FlowLayout.RIGHT, 15, 15));
    
    		JLabel binaireLabel = new JLabel("Binaire : ");
    		binaireLabel.setForeground(Color.WHITE);
    		binaireLabel.setFont(new Font("Serif", Font.BOLD, 14));
    		CalculZone2.setBackground(Color.DARK_GRAY);
    		txtField2.setBackground(Color.DARK_GRAY);
    		txtField2.setForeground(Color.WHITE);
    		txtField2.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.WHITE));
    		txtField2.setFont(new Font("Serif", Font.BOLD, 14));
    		txtField2.setPreferredSize(new Dimension(320, 40));
    
    		txtField2.getDocument().addDocumentListener(new DocumentListener() {
    			public void insertUpdate(DocumentEvent e) { xtField2isCaller = true; txtField2Calcul(txtField2.getText() , getformatchoice()); };
    			public void removeUpdate(DocumentEvent e) { txtField2isCaller = true; txtField2Calcul(txtField2.getText() , getformatchoice()); };
    			public void changedUpdate(DocumentEvent e) { txtField2isCaller = true; txtField2Calcul(txtField2.getText() , getformatchoice()); };
    
    			public void txtField2Calcul(String text, String SelectedItem){
    		
    				if(SelectedItem.equals("Notation Naturelle")){
    		
    					try{
    						// Conversion: txtField2Content (String) -> InttxtField2Content (Binaire naturel)
    						InttxtField2Content = Integer.parseInt(text, 2);
    						
    						if(!txtField1isCaller) {
    							System.out.println("\tAppelle de txtField1 par txtField2Calcul"); 
    							txtField1.setText(Integer.toString(InttxtField2Content));
    						}
    							
    						System.out.println("\tAppelle de txtField3 par txtField2Calcul");
    						txtField3.setText(Integer.toOctalString(InttxtField2Content));
    						System.out.println("\tAppelle de txtField4 par txtField2Calcul ");
    						txtField4.setText(Integer.toHexString(InttxtField2Content));						
    					}
    					catch (NumberFormatException e1)	{
    						txtField1.setText(Integer.toString(InttxtField2Content));	
    						txtField3.setText(Integer.toOctalString(InttxtField2Content));
    						txtField4.setText(Integer.toHexString(InttxtField2Content));
    					}
    		
    				}
    				
    			}
    		
    		});
    
    		CalculZone2.add(binaireLabel);
    		CalculZone2.add(txtField2);
    
    		return CalculZone2;
    	}
    	private JPanel CreateCalculZone3(){
    		JPanel CalculZone3 = new JPanel(new FlowLayout(FlowLayout.RIGHT, 15, 15));
    
    		JLabel OctalLabel = new JLabel("Octal : ");
    		OctalLabel.setForeground(Color.WHITE);
    		OctalLabel.setFont(new Font("Serif", Font.BOLD, 14));
    		CalculZone3.setBackground(Color.DARK_GRAY);
    		txtField3.setBackground(Color.DARK_GRAY);
    		txtField3.setForeground(Color.WHITE);
    		txtField3.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.WHITE));
    		txtField3.setFont(new Font("Serif", Font.BOLD, 14));
    		txtField3.setPreferredSize(new Dimension(320, 40));
    
    		txtField3.getDocument().addDocumentListener(new DocumentListener() {
    			public void insertUpdate(DocumentEvent e) { System.out.println("Caller: txtField3"); txtField3Calcul(txtField3.getText() , getformatchoice()); };
    			public void removeUpdate(DocumentEvent e) { txtField3Calcul(txtField3.getText() , getformatchoice()); };
    			public void changedUpdate(DocumentEvent e) { txtField3Calcul(txtField3.getText() , getformatchoice()); };
    			
    			public void txtField3Calcul(String text, String selectedItem){
    		
    				if(selectedItem.equals("Notation Naturelle")){
    					try{
    						// Conversion: text (String) -> InttxtField3Content (Octal signé)
    						InttxtField3Content = Integer.parseInt(text, 8);
    		
    						
    						/*  Conversion: InttxtField3Content (Octal signé) -> Décimal signé
    						*   											  -> Binaire signé
    						*     											  -> Hexadécimal signé
    						*/
    						if(!txtField1isCaller){
    							System.out.println("Appelle de txtField1 par txtField3Calcul");
    							txtField1.setText(Integer.toString(InttxtField3Content));	
    						}
    						else if(!txtField2isCaller){
    							System.out.println("Appelle de txtField2 par txtField3Calcul");
    							txtField2.setText(Integer.toBinaryString(InttxtField3Content));
    						}
    						System.out.println("\tAppelle de txtField4 par txtField3Calcul");
    						txtField4.setText(Integer.toHexString(InttxtField3Content));
    					}
    					catch (NumberFormatException e1)	{
    						txtField1.setText(Integer.toString(InttxtField3Content));	
    						txtField2.setText(Integer.toBinaryString(InttxtField3Content));
    						txtField4.setText(Integer.toHexString(InttxtField3Content));
    					}
    				}
    				
    			}
    		
    		});
    
    		CalculZone3.add(OctalLabel);
    		CalculZone3.add(txtField3);
    
    		return CalculZone3;
    	}
    	private JPanel CreateCalculZone4(){
    		JPanel CalculZone4 = new JPanel(new FlowLayout(FlowLayout.RIGHT, 15, 15));
    
    		JLabel hexLabel = new JLabel("Hexadecimal :");
    		hexLabel.setForeground(Color.WHITE);
    		hexLabel.setFont(new Font("Serif", Font.BOLD, 14));
    		CalculZone4.setBackground(Color.DARK_GRAY);
    		txtField4.setBackground(Color.DARK_GRAY);
    		txtField4.setForeground(Color.WHITE);
    		txtField4.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.WHITE));
    		txtField4.setFont(new Font("Serif", Font.BOLD, 14));
    		txtField4.setPreferredSize(new Dimension(320, 40));
    
    		txtField4.getDocument().addDocumentListener(new DocumentListener() {
    			public void insertUpdate(DocumentEvent e) { txtField4Calcul(txtField4.getText() , getformatchoice()); };
    			public void removeUpdate(DocumentEvent e) { txtField4Calcul(txtField4.getText() , getformatchoice()); };
    			public void changedUpdate(DocumentEvent e) { txtField4Calcul(txtField4.getText() , getformatchoice()); };
    		
    			public void txtField4Calcul(String text, String selectedItem){
    		
    				if(selectedItem.equals("Notation Naturelle")){
    					try{
    						// Conversion: text (String) -> InttextField4Content (Hexadécimal signé)
    						InttxtField4Content = Integer.parseInt(text, 16);					
    						if(!txtField1isCaller){
    							System.out.println("Appelle de txtField1 par txtField4Calcul");
    							txtField1.setText(Integer.toString(InttxtField4Content));
    						}
    						else if(!txtField2isCaller){
    							System.out.println("Appelle de txtField2 par txtField4Calcul");
    							txtField2.setText(Integer.toBinaryString(InttxtField4Content));
    						}
    						else if(!txtField3isCaller){
    							System.out.println("Appelle de txtField3 par txtField4Calcul");
    							txtField3.setText(Integer.toOctalString(InttxtField4Content));
    						}
    						
    					}
    					catch (NumberFormatException e1)	{
    						txtField1.setText(Integer.toString(InttxtField4Content));	
    						txtField2.setText(Integer.toBinaryString(InttxtField4Content));
    						txtField3.setText(Integer.toOctalString(InttxtField4Content));
    					}
    				}
    				
    			}
    		
    		});
    
    		CalculZone4.add(hexLabel);
    		CalculZone4.add(txtField4);
    
    		return CalculZone4;
    	}



    -
    Edité par GastonPascalTonguino2 25 janvier 2023 à 19:46:38

    • Partager sur Facebook
    • Partager sur Twitter
      27 janvier 2023 à 17:23:19

      Vu l'erreur, je dirais qu'il y a un conflit...

      Quand tu insères ou modifies un texte à l'aide de l'objet JTextField, les autres objets vont être averti de cette modification. Seulement, si au moment de ce temps pour prévenir les autres objets, tu réécris sur ce même objet, il y a conflit.

      Tu dois gérer avec un temps ou un thread peut-être entre l'écriture et la notification.

      -
      Edité par fred1599 27 janvier 2023 à 17:29:10

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        4 février 2023 à 23:04:21

        GastonPascalTonguino2 a écrit:

        Merci;)

        Bonjour,

        Sujet résolu

        Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)

        • Partager sur Facebook
        • Partager sur Twitter

        JTextField et DocumentListener

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown