0

尝试在简单的 Java GUI 程序中应用 ClearButtonHandler 类中的 setText() 方法时,该方法找不到 JTextField 的变量名称。目的是在用户选择清除按钮时清除文本。“找不到符号,变量名 fNameInput”以及我尝试使用该方法的每个变量。

import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.JOptionPane;
import java.awt.*;
import java.util.Scanner.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 *
 * @author joel.ramsey
 */
public class JRStarPhase5 extends JFrame{

    public static void main (String [] args) throws IOException {


    JFrame window = new JRStarPhase5();

    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true);

    }//end main method

    //constructor for JFrame
    public JRStarPhase5(){
        setTitle("JRStar Star Gaze Order Processing");
        setSize (800,800);  
        Container pane = getContentPane();
        GridLayout grid = new GridLayout(0,2);
        pane.setLayout(grid);

        JLabel fNameLabel = new JLabel ("First name:");
        JLabel mi = new JLabel ("Middle initial:");
        JLabel lNameLabel = new JLabel ("Last name:");
        JLabel productChoice = new JLabel ("Star Gaze version:");
        JLabel licenseQuantity = new JLabel ("License quantity:");
        JLabel streetAddress = new JLabel ("Street address:");
        JLabel city = new JLabel ("City:");
        JLabel state = new JLabel ("State abbrev:");
        JLabel zip = new JLabel ("Zip code:");
        JLabel phone = new JLabel ("Phone Number:");
        JTextField fNameInput = new JTextField (15);
        JTextField miInput = new JTextField (1);
        JTextField lNameInput = new JTextField (15);
        JTextField productChoiceInput = new JTextField (1);
        JTextField licenseQuantityInput = new JTextField (2);
        JTextField streetAddressInput = new JTextField (20);
        JTextField cityInput = new JTextField (20);
        JTextField stateInput = new JTextField (2);
        JTextField zipInput = new JTextField (5);
        JTextField phoneInput = new JTextField (10);

        //add as last buttons
        JButton submit = new JButton("Submit");
        SubmitButtonHandler sbh = new SubmitButtonHandler();
        submit.addActionListener(sbh);

        JButton clear = new JButton("Clear");
        ClearButtonHandler cbh = new ClearButtonHandler();
        clear.addActionListener(cbh);

        pane.add(fNameLabel);
        pane.add(fNameInput);
        pane.add(mi);
        pane.add(miInput);
        pane.add(lNameLabel);
        pane.add(lNameInput);
        pane.add(productChoice);
        pane.add(productChoiceInput);
        pane.add(licenseQuantity);
        pane.add(licenseQuantityInput);
        pane.add(streetAddress);
        pane.add(streetAddressInput);
        pane.add(city);
        pane.add(cityInput);
        pane.add(state);
        pane.add(stateInput);
        pane.add(zip);
        pane.add(zipInput);
        pane.add(phone);
        pane.add(phoneInput);

        //add last
        pane.add(submit);
        pane.add(clear);

    }//end constructor

    private class SubmitButtonHandler implements ActionListener{

        public void actionPerformed(ActionEvent e){

            JOptionPane.showMessageDialog(null,"Your order has been submitted!");
            System.exit(0);
        }

    }//end submit

    private class ClearButtonHandler implements ActionListener{

        public void actionPerformed(ActionEvent e){

            fNameInput.setText("");  
            miInput.setText("");
            lNameInput.setText("");
            streetAddressInput.setText("");

       }

    }//end clear

}//end main class    
4

5 回答 5

2

问题是范围。由于ClearButtonHandler您定义的范围,该类找不到 JtextField。

JtextFields 的范围是 JRStarPhase5 构造函数。它们在外面是不可见的。将 JTextField 定义为实例变量(在 JRStarPhase5 构造函数外部)并在构造函数内部实例化。

于 2013-09-20T10:17:16.067 回答
1

fNameInput仅对声明它的构造函数具有本地上下文JRStarPhase5

如果要访问构造函数之外的组件,则应将它们声明为实例字段...

例如

public class JRStarPhase5 extends JFrame{

    /*...*/

    private JTextField fNameInput;

    /*...*/

    public JRStarPhase5(){
        /*...*/
        fNameInput = new JTextField (15);        

您可能需要查看了解实例和类成员以了解更多详细信息

于 2013-09-20T10:19:50.810 回答
1

您的JTextField变量在 的范围内不可见ClearButtonHandlerJRStarPhase5要修复,请在类范围内声明变量

public class JRStarPhase5 extends JFrame {

   JTextField fNameInput;
   ...

还要删除JTextField构造函数中的初始关键字JRStarPhase5以避免阴影

fNameInput = new JTextField (15);
...
于 2013-09-20T10:17:00.370 回答
1

我认为您的问题是,您的变量超出了范围。您在构造函数中定义TextField's,在构造函数之后,您失去了对 this 变量的引用。尝试将它们定义为字段。

public class JRStarPhase5 extends JFrame{
     public TextFild name1, name2, name3,... ;
     ...
     public JRStarPhase5(){
         this.name1 = new TextField("...");
         //and so on..

现在您可以在下面的代码中使用它们。

另请参见java 中的字段

于 2013-09-20T10:17:34.653 回答
0

在类中公开所有字段和标签,然后在构造函数中初始化它们。

于 2013-09-20T10:21:53.810 回答