SetText方法找不到JTextField的变量名

时间:2013-09-20 10:14:15

标签: java swing

当尝试在简单的java GUI程序中将ClearTeuttonHandler类中的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    

5 个答案:

答案 0 :(得分:2)

问题在于范围。由于您已定义的范围,ClearButtonHandler类无法找到JtextField。

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

答案 1 :(得分:1)

JTextField变量在ClearButtonHandler范围内不可见。要修复,请在JRStarPhase5

的范围内声明变量
public class JRStarPhase5 extends JFrame {

   JTextField fNameInput;
   ...

同时删除JTextField构造函数中的JRStarPhase5个初始关键字以避免shadowing

fNameInput = new JTextField (15);
...

答案 2 :(得分:1)

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

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

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

另见Fields in java

答案 3 :(得分:1)

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

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

例如

public class JRStarPhase5 extends JFrame{

    /*...*/

    private JTextField fNameInput;

    /*...*/

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

您可能需要查看Understanding Instance and Class Members了解更多详情

答案 4 :(得分:0)

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