GUI Проблемы с чтением JTextField - PullRequest
4 голосов
/ 13 февраля 2012

Я не могу понять, в чем причина этой ошибки, я попытался изменить несколько вещей, но просто не могу заставить "CalculateButtonHandler работать правильно. Извините, выложил весь этот код, но в прошлый раз я не былне достаточно конкретен: S Если бы кто-то мог указать мне правильное направление, это было бы здорово. Спасибо.

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();
    }
}

Ответы [ 4 ]

2 голосов
/ 13 февраля 2012

Вы анализируете текст sideX, который является JLabels, а не вашими JTextFields.Замените sideX на inputX в вашем CalculateButtonHandler, и все будет хорошо

2 голосов
/ 13 февраля 2012

В вашем CalculateButtonHandler классе вы используете JLabel для получения ввода, похоже, вам нужен JTextField для получения ввода, измените этот класс на этот:

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");
        }
    }       
}

И со следующего раза всегда планируйте JOB для потока диспетчера событий, при этом используя Swing, как в вашем случае ваш основной метод должен выглядеть следующим образом:

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();
            }
        });
    }
}

Чтобы узнать больше о том, о чем я говорю, прочитайте Параллельность в Swing . В этой главе есть очень важная вещь о Swing.

2 голосов
/ 13 февраля 2012

1) используйте JFormattedTextField Number instance) вместо простого JTextField , тогда вы не сможете решить синтаксический анализ Number экземпляра String,

2) выглядит так: код разбора текста из JLabels вместо JTextFields

1 голос
/ 13 февраля 2012

Вы также напрямую сравниваете двойники. Маловероятно, что вы получите это сравнение как истинное. Запустите это:

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));</p> <p>}

...