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 コンストラクターです。それらはその外には見えません。JTextFields をインスタンス変数として (外部で) JRStarPhase5 コンストラクターとして定義し、コンストラクター内でインスタンス化します。

于 2013-09-20T10:17:16.067 に答える
1

JTextField変数は のスコープ内では表示されませんClearButtonHandlerJRStarPhase5修正するには、クラスのスコープ内で変数を宣言します

public class JRStarPhase5 extends JFrame {

   JTextField fNameInput;
   ...

シャドーイングを避けるためJTextFieldに、のコンストラクターの最初のキーワードも削除しますJRStarPhase5

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

あなたの問題は、あなたの変数が範囲外であることだと思います。コンストラクターで 's を定義TextFieldし、コンストラクターの後で、この変数への参照を失います。それらをフィールドとして定義してみてください。

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 に答える
1

fNameInputJRStarPhase5宣言されているコンストラクターに対してのみローカル コンテキストを持ちます。

コンストラクターの外部のコンポーネントにアクセスする場合は、それらをインスタンス フィールドとして宣言する必要があります...

例えば

public class JRStarPhase5 extends JFrame{

    /*...*/

    private JTextField fNameInput;

    /*...*/

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

詳細については、インスタンスとクラス メンバーの理解を参照してください。

于 2013-09-20T10:19:50.810 に答える
0

クラス内ですべてのフィールドとラベルを public にしてから、コンストラクターで初期化します。

于 2013-09-20T10:21:53.810 に答える