【问题标题】:GUI Trouble reading JTextFieldGUI 无法读取 JTextField
【发布时间】:2012-02-13 12:42:16
【问题描述】:

我不知道我哪里出了问题,我试图改变一些东西,但我无法让“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();
    }
}

【问题讨论】:

  • 请定义“正常工作”和“工作不正常”。您希望它做什么,它会做什么?

标签: java swing user-interface jtextfield


【解决方案1】:

您正在解析作为 JLabels 而不是 JTextFields 的 sideX 文本。在CalculateButtonHandler 中用 inputX 替换 sideX,一切都会好起来的

【讨论】:

  • +1,好像我刷新页面太晚了,你的答案在这之前就已经出现了。不错的收获,我花时间提供整个输出。
  • 哇,我觉得自己很笨。在看了我的代码几个小时后,这是多么愚蠢的错误,谢谢
【解决方案2】:

1) 使用JFormattedTextField (witt Number instance) 而不是普通的JTextField,那么你永远无法解决从String 解析Number 实例的问题,

2) 看起来这段代码从JLabels 而非JTextFields 解析文本

【讨论】:

  • +1,为了很好的收获,我提交整个答案太晚了:-)
【解决方案3】:

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

从下一次开始,总是为 Event Dispatcher 线程安排一个 JOB,而在你的情况下使用 Swing,你的 main 方法必须如下所示:

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

要了解更多关于我所说的内容,请阅读Concurrency in Swing。关于 Swing 的非常重要的事情在本章中。

【讨论】:

  • 我最初将我的计算作为 JTextField,但它仍然没有读取。我不明白“SwingUtilities.invokeLater (new Runnables()) 是什么(今天稍后我将不得不研究它)但是我在 eclipse 中遇到的错误是关于 AWT-EventQue-0 的一些信息然后去了继续谈论floatingDecimals(我还在弄清楚如何在eclipse中调试)我是否正确设置了num1 num2 num3?
  • @ChewOnThis_Trident :给我 2 分钟,我将发布您的代码以及所需的更改,这可能可以解释您的事情。
【解决方案4】:

您还直接比较双打。您不太可能将这种比较视为真实。运行这个:

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

}

【讨论】:

  • +1,毫无疑问,这是发人深省的食物,不过我很久以前就投过票了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多