2017-02-15 6 views
0

私はJavaを初めて使用しています。私はこれを探しましたが、明確な答えは見つかりませんでした。Javaで外部で使用するvoidメソッド内の変数値を変更しますか?

voidメソッド内で事前定義された変数の値を変更し、別のvoidメソッドで新しい値を使用する方法はありますか?

私は必要なもの

:EclipseのWindowBuilderで、ボタンをクリックすると、このボタンの外側で定義された変数の値を変更する必要があります。 別のボタンをクリックすると新しい値を使用できます。しかし、他のボタンをクリックすると、最初に定義された値が使用され、変更された値は使用されません。

更新:サンプルコード:

private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 450, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 
     String x = "0"; 

     JButton btn1 = new JButton("Button 1"); 
     btn1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       String x = "1"; 
       textField1.setText(x);    
      } 
     }); 
     btn1.setBounds(102, 134, 89, 23); 
     frame.getContentPane().add(btn1); 

     JButton btn2 = new JButton("Button 2"); 
     btn2.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       textField2.setText(x); 
      } 
     }); 
     btn2.setBounds(232, 134, 89, 23); 
     frame.getContentPane().add(btn2); 

     textField1 = new JTextField(); 
     textField1.setBounds(159, 85, 86, 20); 
     frame.getContentPane().add(textField1); 
     textField1.setColumns(10); 

     textField2 = new JTextField(); 
     textField2.setColumns(10); 
     textField2.setBounds(159, 179, 86, 20); 
     frame.getContentPane().add(textField2); 
    } 

enter image description here

は、だからここx"0"として初期化されます。 ボタン1をクリックすると、x"1"に変更されます。次に、ボタン2をクリックすると、"0"であり、"1"ではない初期化値が得られます。

+0

これは静的変数またはインスタンス変数の場合はyes、そうでない場合はnoです。編集:_predifined変数_を単語や小文字で定義してください – AxelH

+0

プリミティブではなく変更できない場合 - コードを表示してください –

+0

ようこそ!良い質問をするのを助けるために私たちの[SO Question Checklist](http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist)をよく読んで、良い答えを得てください。 –

答えて

2

、あなたがx

JButton btn1 = new JButton("Button 1"); 
    btn1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      final String x = "1"; 
      textField1.setText(x);    
     } 
    }); 

ローカル変数を使用しているこの変数は、宣言したActionListener.actionPerformed内部クラスメソッドの外に存在しません。

あなたのニーズに合ったスコープで変数を宣言する必要があります。

この場合、可変インスタンス(下記の注を参照)を使用する必要があります。したがって、メソッドinitializeの外にString xをインスタンスの一部として宣言してください。

String x; //instance variable to be shared 
private void initialize() { 
    ... 
    JButton btn1 = new JButton("Button 1"); 
    btn1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      x = "1"; 
      textField1.setText(x);    
     } 
    }); 

    JButton btn2 = new JButton("Button 2"); 
    btn2.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      textField2.setText(x); 
     } 
    }); 

} 

注:内部クラスの内部で使用されるようにfinalとしてそれを配置する必要がありますので、あなたは単にinitialize方法でそれを置くことはできませんが、それはでは不可能であるので、あなたはそれに値を設定していますあなたの場合。

PS:

はちょうどあなたがクリック方式で

String x = "0"; 

JButton btn1 = new JButton("Button 1"); 
btn1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     String x = "1"; 
     textField1.setText(x);    
    } 
}); 

initialize方法のString xをシャドーイングされた、これは現在"0"xを使用することはありません、それはcompletly異なるものになることに気づきますインスタンス(名前が同じであっても)。だからあなたはあまりにもその宣言を削除する必要があります私はちょうど私が宣言したインスタンス変数を隠しているので。

What are Shadow Variables in Java

しかし、簡単な説明は次のようになりますに小さな例

範囲に近い同じ名前を持つ別の変数がある場合

変数が隠されていますこのシャドウイングは

+0

答えをありがとうが、私は 'final'を削除し、' String'だけを使用しましたが、それでも動作しません。 – AhmedWas

+0

finalで定数を宣言します。 AxelHが述べたように、あなたはまだ新しい変数を定義します。文字列も削除します。 – IQV

+0

@AhmedWas私は私の答えに興味深いものを追加しました。メソッド内に 'String x'を定義しているので、編集を確認する必要があります。これが明確でない場合(これを説明する方法がわからない場合)、私はこれを再調整しようとします。 – AxelH

0

NEW変数xを宣言しています。これは問題です。代わりに、xを変更してメンバ変数として定義する必要があります(この回答の下のコメントにIQVが言ったように)。あなたのコードで

public void actionPerformed(ActionEvent e) { 
    final String x = "1"; // this should be x = ""; 
    textField1.setText(x); 
} 
+0

を確認してください。しかし、 'initialize()'の外でクラス変数として 'x'を定義することをお勧めします。それ以外の場合は、このメソッドで 'x'のみを使用できます。 – IQV

1

変数は、メソッド内のローカル変数ではなく、クラスのインスタンス変数として定義する必要があります。この方法では、すべてのボタンが、メソッド内にカプセル化された変数だけでなく変数にアクセスできるようになります。

編集:

ここで私が意味する、まさに示すためにいくつかのサンプルコードです。

final void initialize(){ 
    String x = "0"; //x is defined within the scope of this method only. 
} 

これが唯一のinitializeメソッド内に格納する変数xを制約: 現在あなたは、このような変数xを定義しています。しかし、あなたはxを次のように定義したいと考えています:

String x; //Instance variable which is available to the entire class 
final void initialize(){ 
    x = "0"; //modifies the instance variable for the entire class 
} 
+1

コードでもっと説明できますか?ありがとう! – AhmedWas

+0

@AhmedWasもちろん!コードを見たらそれはかなり単純な変更です。 – iSeeJay

関連する問題