Java 我无法在字段中输入数据

Java 我无法在字段中输入数据,java,swing,user-interface,jtextfield,Java,Swing,User Interface,Jtextfield,我正在为学校做这项作业。我一直在一遍又一遍地查看我的代码。问题是,当我尝试运行这个程序时,我无法将数据输入到字段中。当我尝试选择要输入数据的字段时,它不允许我输入数据。有人请帮帮我 import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEven

我正在为学校做这项作业。我一直在一遍又一遍地查看我的代码。问题是,当我尝试运行这个程序时,我无法将数据输入到字段中。当我尝试选择要输入数据的字段时,它不允许我输入数据。有人请帮帮我

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.DecimalFormat;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class OfficeAreaCalculator extends JFrame{

private JFrame mainFrame;
private JButton calculateButton;
private JButton exitButton;
private JTextField lengthField;
private JTextField widthField;
private JTextField areaField;
private JLabel lengthLabel;
private JLabel widthLabel;
private JLabel areaLabel;

public OfficeAreaCalculator()
{
    mainFrame = new JFrame("Office Area Calculator");

    exitButton = new JButton("Exit");
    lengthLabel = new JLabel("Enter the length of the office:");
    widthLabel = new JLabel("Enter the width of the office:");
    areaLabel = new JLabel("Office area:");
    lengthField = new JTextField(5);
    widthField = new JTextField(5);
    areaField = new JTextField(5);
    areaField.setEditable(false);
    calculateButton = new JButton("Calculate");

    Container c = mainFrame.getContentPane();
    c.setLayout(new FlowLayout());

    c.add(lengthLabel);
    c.add(lengthField);
    c.add(widthLabel);
    c.add(widthField);
    c.add(areaLabel);
    c.add(areaField);
    c.add(calculateButton);
    c.add(exitButton);

    calculateButton.setMnemonic('C');
    exitButton.setMnemonic('X');

    mainFrame.setSize(260, 150);

    mainFrame.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });

    CalculateButtonHandler chandler = new CalculateButtonHandler();
    calculateButton.addActionListener(chandler);

    ExitButtonHandler ehandler = new ExitButtonHandler();
    exitButton.addActionListener(ehandler);

    FocusHandler fhandler = new FocusHandler();
    lengthField.addFocusListener(fhandler);
    widthField.addFocusListener(fhandler);
    areaField.addFocusListener(fhandler);

    mainFrame.setVisible(true);
}

class CalculateButtonHandler implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        DecimalFormat num = new DecimalFormat(",###.##");
        double width, length, area;
        String instring;

        instring = lengthField.getText();
        if (instring.equals(""));
        {
            instring = ("0");
            lengthField.setText("0");
        }
        length = Double.parseDouble(instring);

        instring = widthField.getText();
        if (instring.equals(""))
        {
            instring = "0";
            widthField.setText("0");
        }
        width = Double.parseDouble(instring);

        area = length * width;
        areaField.setText(num.format(area));

    }

}

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

class FocusHandler implements FocusListener
{
    public void focusGained(FocusEvent e)
    {
        if (e.getSource() == lengthField || e.getSource() == widthField)
        {
            areaField.setText("");
        }
        else if (e.getSource() == areaField);
        {
            calculateButton.requestFocus();
        }
    }

    public void focusLost(FocusEvent e)
    {
        if (e.getSource() == widthField)
        {
            calculateButton.requestFocus();
        }
    }
}

public static void main(String arg[])
{
    new OfficeAreaCalculator();
}
}
问题:

当您当前聚焦文本字段时,它将以一个永无止境的循环将焦点转移到按钮,因此您不能在那里键入任何内容,焦点始终在按钮上,并且永远不会在文本字段中

解决方案:

删除或不将FocusListener添加到文本字段。

问题:

当您当前聚焦文本字段时,它将以一个永无止境的循环将焦点转移到按钮,因此您不能在那里键入任何内容,焦点始终在按钮上,并且永远不会在文本字段中

解决方案:


删除或不将FocusListener添加到文本字段。

一般建议。在开始测试之前,不要一次性编写整个程序

1只需创建包含所有组件的GUI。那就是删除所有的侦听器代码,看看它是否有效

2每次添加一个侦听器,看看每个侦听器是否工作

3当代码停止工作时,您就知道问题出在哪里,您就知道在哪里花时间进行调试,您将能够向我们提供更多信息来帮助解决问题

事实证明,问题在于打字错误:

    else if (e.getSource() == areaField);
你不应该有这样的想法;在语句末尾,这将导致calculateButton.requestFocus;每次尝试将焦点放在任一文本字段上时要执行的语句


一般来说,您不应该使用FocusListener来控制组件的焦点。使用Tab键时,焦点将自然移动。您的区域字段实际上不应该是文本字段。它可能是一个无论如何都不会获得焦点的JLabel,因此焦点将直接从宽度文本字段转到按钮。

一般建议。在开始测试之前,不要一次性编写整个程序

1只需创建包含所有组件的GUI。那就是删除所有的侦听器代码,看看它是否有效

2每次添加一个侦听器,看看每个侦听器是否工作

3当代码停止工作时,您就知道问题出在哪里,您就知道在哪里花时间进行调试,您将能够向我们提供更多信息来帮助解决问题

事实证明,问题在于打字错误:

    else if (e.getSource() == areaField);
你不应该有这样的想法;在语句末尾,这将导致calculateButton.requestFocus;每次尝试将焦点放在任一文本字段上时要执行的语句


一般来说,您不应该使用FocusListener来控制组件的焦点。使用Tab键时,焦点将自然移动。您的区域字段实际上不应该是文本字段。它可能是一个JLabel,无论如何都不会获得焦点,因此焦点将直接从宽度文本字段转到按钮。

摆脱calculateButton.requestFocus的两个实例;从你的调焦手柄。它似乎在功能上没有任何用处,而且每次尝试使用文本字段时,它都会将焦点从文本字段上移开。

去掉calculateButton.requestFocus的两个实例;从你的调焦手柄。它在功能上似乎没有任何用处,每次尝试使用文本字段时,它都会将焦点从文本字段上移开。

谢谢您的反馈。这似乎总是一个打字错误。仅仅因为打字错误,编程就耗费了我数小时的时间。我还在学习,我感谢你的帮助!PS:我们必须为这项特殊任务使用焦点组件。这是获得全额学分所必需的。感谢您的反馈。这似乎总是一个打字错误。仅仅因为打字错误,编程就耗费了我数小时的时间。我还在学习,我感谢你的帮助!PS:我们必须为这项特殊任务使用焦点组件。这是获得全额学分所必需的。