0

基本的な計算機を作成しようとしていますが(完了していません)、アクションリスナーが変数「add」が存在しないと言っているというエラーが発生します。私はすべてなどを解析しましたが、変数が正しく宣言されていないようです。コードは次のとおりです。

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;

public class Gui extends JFrame{

    private JButton reg;
    private JButton reg2;
    private JButton reg3;
    private JButton reg4;
    private JTextField text;
    private JTextField text2;
    private JTextField text3;
    private JTextField text4;
    private JTextField text5;
    private JTextField text6;
    private JTextField text7;
    private JTextField text8;


    public Gui(){
        super("Buttons");
        setLayout(new FlowLayout());



        text = new JTextField("000000000000000000000");
        text2 = new JTextField("000000000000000000000");
        text3 = new JTextField("000000000000000000000");
        text4 = new JTextField("000000000000000000000");
        text5 = new JTextField("000000000000000000000");
        text6 = new JTextField("000000000000000000000");
        text7 = new JTextField("000000000000000000000");
        text8 = new JTextField("000000000000000000000");
        reg = new JButton("Add");
        reg2 = new JButton("Divide");
        reg3 = new JButton("Multiply");
        reg4 = new JButton("Subtract");

        add(text);
        add(text2);
        add(reg);
        add(text3);
        add(text4);
        add(reg2);
        add(text5);
        add(text6);
        add(reg3);
        add(text7);
        add(text8);
        add(reg4);

        String st = text.getText();
        String st2 = text.getText();
        String st3 = text.getText();
        String st4 = text.getText();
        String st5 = text.getText();
        String st6 = text.getText();
        String st7 = text.getText();
        String st8 = text.getText();

        int txt1 = Integer.parseInt(st);
        int txt2 = Integer.parseInt(st2);
        int txt3 = Integer.parseInt(st3);
        int txt4 = Integer.parseInt(st4);
        int txt5 = Integer.parseInt(st5);
        int txt6 = Integer.parseInt(st6);
        int txt7 = Integer.parseInt(st7);
        int txt8 = Integer.parseInt(st8);

        int add=txt1+txt2;
        if(txt4>0){
            int add2=txt3/txt4;
        }
        int add3=txt5*txt6;
        int add4=txt7-txt8;


        handlerClass handler = new handlerClass();
        reg.addActionListener(handler);
        reg2.addActionListener(handler);
        reg3.addActionListener(handler);
        reg4.addActionListener(handler);






    }

    public class handlerClass implements ActionListener{
        public void actionPerformed(ActionEvent event){
            if(event.getActionCommand()=="Add"){
                JOptionPane.showMessageDialog(null, String.format("Answer: %s", add));
            }
        }
    }
}

これがエラーコードです

Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem: 
    add cannot be resolved to a variable

    at Gui$handlerClass.actionPerformed(Gui.java:101)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem: 
    add cannot be resolved to a variable

    at Gui$handlerClass.actionPerformed(Gui.java:101)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem: 
    add cannot be resolved to a variable

    at Gui$handlerClass.actionPerformed(Gui.java:101)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
4

7 に答える 7

3

これ:

JOptionPane.showMessageDialog(null, String.format("Answer: %s", add));

変数として使用しようとしaddます。ただし、その変数はメソッドには存在しません。actionPerformedコンストラクター内のローカル変数ですGui。メソッドでaddあるので少し混乱しますが、根本的な問題は、コンストラクター内でローカルに宣言した変数が後で存在しないことです。add

また、この比較に注意してください。

if(event.getActionCommand()=="Add")

コマンドの提供方法によっては機能する場合がありますが、実際にはString 参照を比較しているだけです。以下を使用する必要があります。

if (event.getActionCommand().equals("Add"))

または、アクション コマンドが null の可能性がある場合 (そして、わざわざチェックしたくない場合):

if ("Add".equals(event.getActionCommand())

また、次の点にも注意してください。

スレッド「AWT-EventQueue-0」の例外 java.lang.Error: 未解決のコンパイルの問題: add を変数に解決できません

は、Eclipse からの「コードがコンパイルされません。とにかく実行しますか?」という警告をおそらく無視したことを示しています。

コンパイルできないコードを実行しようとするべきではありません。実行する前にコンパイル時のエラーを修正する必要があります。

于 2012-06-02T14:23:14.367 に答える
3

実際、ActionListener 内でaddは定義されていません。これは、Gui コンストラクターのローカル変数です。

actionPerformed()テキストフィールドから読み取って追加を実行する必要があるのは、アクションが実行されたとき (つまり、メソッド内) だけです。現在、コードは、Gui の初期化時にテキスト フィールドにあるものを追加し、アクションの実行時にこの最初の追加の結果を表示しようとしています。

また、actionPerformed メソッド内でボタン テキストを比較する代わりに、各ボタンに特定の ActionListener を追加する方がはるかにクリーンです。追加ボタンに追加するリスナーを追加します。減算ボタンなどに減算するリスナー。

于 2012-06-02T14:23:58.643 に答える
2

アーロン、コンパイラを信じてください。あなたのコードは間違っています、間違っています、間違っています。

public class handlerClass implements ActionListener{
    public void actionPerformed(ActionEvent event){
        if(event.getActionCommand()=="Add"){
            JOptionPane.showMessageDialog(null, String.format("Answer: %s", add));
        }
    }
}

actionPerformed のスコープに add という名前の変数はありません。コンストラクターで宣言したものは、ここでは表示されないローカル変数です。

于 2012-06-02T14:23:03.613 に答える
2

あなたが尋ねているならadd、それはあなたがコンストラクターで宣言したからです

public Gui(){
...
    int add=txt1+txt2;
...
}

これはローカル参照であり、他のメソッドや内部クラスでは使用できません。そこで使いたい場合はクラスフィールドにしてください。

public class Gui extends JFrame{
...
    int add;

    public Gui(){
    ...
        int add=txt1+txt2;
    ...
    }
    public class handlerClass implements ActionListener{
        //now add will be accesible here
    }

}
于 2012-06-02T14:23:44.837 に答える
1

またadd2、存在しないと言う必要があります。

実装内では、コンストラクターで宣言されたローカル変数ActionListenerにアクセスできません。addインスタンス変数、静的などのいずれかである必要があります。

于 2012-06-02T14:22:52.340 に答える
1

変数「add」は、Gui のクラス コンストラクターで宣言されていますが、インスタンス化されることはありません。これは、プログラムの構造と変数のスコープに関する基本的な問題です。

于 2012-06-02T14:32:38.870 に答える
0

addコンストラクター内で変数を宣言しました。これは、それaddがローカル変数であり、コンストラクター内でのみ可視であることを意味します。

変数の宣言をadd外側に移動するだけです。つまり、ネストされたクラスから見えるようにする場合は、インスタンス変数を追加します。

インスタンス変数には、次のような変数がもう 1 つあります。

private JButton reg;
private JButton reg2;
...
private JTextField text7;
private JTextField text8;


private int add;

値を割り当てる以下の行は、次のようにadd変更されます。

    int add=txt1+txt6;

    add=txt1+txt2;

int ネストされたクラスから見えるようにする場合は、他の変数についても同じことを行う必要があることに注意してください。

于 2012-06-08T06:39:43.243 に答える