4 votes

Trouble de l'interface graphique dans la lecture de JTextField

Je n'arrive pas à comprendre où je me trompe, j'ai essayé de modifier quelques éléments mais je n'arrive pas à faire fonctionner correctement le "CalculateButtonHandler". Je suis désolé d'avoir mis tout ce code, mais la dernière fois, je n'ai pas été assez précis :S Si quelqu'un pouvait m'indiquer la bonne direction, ce serait formidable. Merci.

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

// some kind of problem with Calculate button handler (LINE 78 

public class Program5 extends JFrame
{
    // Setting up for the program
    private JLabel side1, side2, side3, str, result;

    private JButton calculate, endProgram;

    private JTextField input1, input2, input3;

    private CalculateButtonHandler calcHandler;
    private EndProgramButtonHandler endHandler;

    private Container pane;

    private static final int WIDTH = 500;
    private static final int HEIGHT = 350;

    // constructor
    public Program5()
    {
        // create labels
        side1 = new JLabel ("Triangle's Longest Side: ", SwingConstants.CENTER);
        side2 = new JLabel ("Triangle's Next Side: ", SwingConstants.CENTER);
        side3 = new JLabel ("Triangle's Last Side: ", SwingConstants.CENTER);
        result = new JLabel ("", SwingConstants.CENTER);
        str = new JLabel ("Is the Triangle a right Triangle?",SwingConstants.CENTER);

        // create text fields
        input1 = new JTextField ("", 60);
        input1.setHorizontalAlignment(JTextField.CENTER);
        input2 = new JTextField ("", 60);
        input2.setHorizontalAlignment(JTextField.CENTER);
        input3 = new JTextField ("", 60);
        input3.setHorizontalAlignment(JTextField.CENTER);

        // create buttons
        calculate = new JButton ("Calculate");
        calcHandler = new CalculateButtonHandler ();
        calculate.addActionListener(calcHandler);

        endProgram = new JButton ("Exit");
        endHandler = new EndProgramButtonHandler();
        endProgram.addActionListener(endHandler);

        // Set title of Window
        setTitle ("Right Triangle Tester");

        //Get Container
        pane = getContentPane();

        // set Layout
        pane.setLayout (new GridLayout (5, 2));

        // place the components in the pane
        pane.add(side1);
        pane.add(input1);
        pane.add(side2);
        pane.add(input2);
        pane.add(side3);
        pane.add(input3);
        pane.add(str);
        pane.add(result);
        pane.add(calculate);
        pane.add(endProgram);

        // set size of the window and display it
        setSize (WIDTH, HEIGHT);
        setVisible (true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     
    }

    private class CalculateButtonHandler implements ActionListener
    {
        public void actionPerformed (ActionEvent e)
        {
            double num1, num2, num3;
            num1 = Double.parseDouble(side1.getText());
            num2 = Double.parseDouble(side2.getText());
            num3 = Double.parseDouble(side3.getText());

            if ((num1*num1) == ((num2*num2)+(num3*num3)))
            {
                result.setText("YES");
            }
            else
            {
            result.setText("NO");
            }
        }       
    }

    private class EndProgramButtonHandler implements ActionListener
    {
        public void actionPerformed (ActionEvent e)
        {
            System.exit(0);
        }
    }

    public static void main(String[] args)  
    {       
        Program5 myObject = new Program5();
    }
}

2voto

mKorbel Points 90340

1) utiliser JFormattedTextField (witt Number instance ) plutôt que de simples JTextField alors vous ne pourrez jamais résoudre l'analyse syntaxique. Number instance de String ,

2) on dirait que ce code analyse le texte à partir de JLabels au lieu de JTextFields

2voto

Guillaume Polet Points 31933

Vous analysez le texte sideX, qui correspond aux JLabels et non à vos JTextFields. Remplacez le sideX par inputX dans votre fichier CalculateButtonHandler et tout ira bien

2voto

nIcE cOw Points 16890

Dans votre CalculateButtonHandler classe que vous utilisez JLabel pour obtenir l'entrée, il semble que vous ayez besoin de JTextField pour obtenir l'entrée pour cela, changez cette classe en ceci :

private class CalculateButtonHandler implements ActionListener
{
    public void actionPerformed (ActionEvent e)
    {
        double num1, num2, num3;
        num1 = Double.parseDouble(input1.getText());
        num2 = Double.parseDouble(input2.getText());
        num3 = Double.parseDouble(input3.getText());

        if ((num1*num1) == ((num2*num2)+(num3*num3)))
        {
            result.setText("YES");
        }
        else
        {
            result.setText("NO");
        }
    }       
}

Et à partir de la prochaine fois, planifiez toujours un JOB pour le thread du répartiteur d'événements, en utilisant Swing comme dans votre cas, votre méthode principale doit ressembler à ceci :

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

// some kind of problem with Calculate button handler (LINE 78 

public class Program5 extends JFrame
{
    // Setting up for the program
    private JLabel side1, side2, side3, str, result;

    private JButton calculate, endProgram;

    private JTextField input1, input2, input3;

    private CalculateButtonHandler calcHandler;
    private EndProgramButtonHandler endHandler;

    private Container pane;

    private static final int WIDTH = 500;
    private static final int HEIGHT = 350;

    // constructor
    public Program5()
    {
            // create labels
        side1 = new JLabel ("Triangle's Longest Side: ", SwingConstants.CENTER);
        side2 = new JLabel ("Triangle's Next Side: ", SwingConstants.CENTER);
        side3 = new JLabel ("Triangle's Last Side: ", SwingConstants.CENTER);
        result = new JLabel ("", SwingConstants.CENTER);
        str = new JLabel ("Is the Triangle a right Triangle?",SwingConstants.CENTER);

            // create text fields
        input1 = new JTextField ("",60);
        input1.setHorizontalAlignment(JTextField.CENTER);
        input2 = new JTextField ("",60);
        input2.setHorizontalAlignment(JTextField.CENTER);
        input3 = new JTextField ("",60);
        input3.setHorizontalAlignment(JTextField.CENTER);

        // create buttons
        calculate = new JButton ("Calculate");
        calcHandler = new CalculateButtonHandler ();
        calculate.addActionListener(calcHandler);

        endProgram = new JButton ("Exit");
        endHandler = new EndProgramButtonHandler();
        endProgram.addActionListener(endHandler);

        // Set title of Window
        setTitle ("Right Triangle Tester");

        //Get Container
        pane = getContentPane();

        // set Layout
        pane.setLayout (new GridLayout (5,2));

        // place the components in the pane
        pane.add(side1);
        pane.add(input1);
        pane.add(side2);
        pane.add(input2);
        pane.add(side3);
        pane.add(input3);
        pane.add(str);
        pane.add(result);
        pane.add(calculate);
        pane.add(endProgram);

        // set size of the window and display it
        setSize (WIDTH, HEIGHT);
        se1tVisible (true);
        setDefaultCloseOperation (EXIT_ON_CLOSE);       
    }

    private class CalculateButtonHandler implements ActionListener
    {
        public void actionPerformed (ActionEvent e)
        {
            double num1, num2, num3;
            num1 = Double.parseDouble(input1.getText());
            num2 = Double.parseDouble(input2.getText());
            num3 = Double.parseDouble(input3.getText());

            if ((num1*num1) == ((num2*num2)+(num3*num3)))
            {
                result.setText("YES");
            }
            else
            {
                result.setText("NO");
            }
        }       
    }

    private class EndProgramButtonHandler implements ActionListener
    {
        public void actionPerformed (ActionEvent e)
        {
            System.exit(0);
        }
    }

    public static void main(String[] args)  
    {
        // Here this is used to attain Concurrency in Swing.
        // So that if there is a need to update the GUI, 
        // that can be done without any difficulty or freezing the GUI.
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                Program5 myObject = new Program5();
            }
        });
    }
}

Pour en savoir plus sur ce dont je parle, lire La concussion dans Swing . Ce chapitre contient des informations très importantes sur le Swing.

1voto

wmz Points 3525

Vous comparez aussi directement les doubles. Il est très peu probable que vous obteniez cette comparaison comme vraie. Exécutez ceci :

     double num1,num2,num3;
     num1=2.8284271247461903;   //== Math.sqrt(8) 
     num2=2.0; num3=2.0;
     if ((num1*num1) == ((num2*num2)+(num3*num3)))
         System.out.println  ("yes");
     else System.out.println  ("no " + num1*num1 + " " + (num2*num2 + num3*num3));

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X