2013-08-29 92 views
0

我有一個擺動類,包含聲明爲最終String變量STR3和兩個如何在內部變更時通過外部類更改變量值?

的ActionListener接口,其由兩個Jbutton將實施B1

和b2,當按下B1的JButton STR3字符串取值,

這裏如何使整個班級

被改變的,而在第二ActionListener接口(並非僅在第一內部類)STR3值我的問題。

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.util.*; 

public class mySwing extends JFrame { 

    JButton b1, b2; 

    public mySwing() { 
     final String str3; 
     JPanel panel = new JPanel(); 
     b1 = new JButton("please click me first"); 
     b2 = new JButton("please click me second"); 
     final JTextField txt = new JTextField("       "); 
     panel.add(txt); 
     Container pane = getContentPane(); 
     panel.add(b1); 
     panel.add(b2); 
     pane.add(panel); 
     str3 = new String(); 
     b1.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent acv) { 
       String input = "HelloWorld"; 
       String str3 = new String(input.substring(0, 5)); 
       txt.setText(str3); 
      } 
     }); 
     b2.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent acv) { 
       txt.setText(str3); 
      } 
     }); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new mySwing(); 
    } 
} 

回答

1

只需讓str3成爲外部類mySwing的非最終實例變量。

順便說一句,不要做這樣的事情new String(input.substring(0, 5))input.substring(0, 5)結果一個字符串,所以你不`噸需要創建另一個字符串。基於您的代碼

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.util.*; 

public class mySwing extends JFrame { 

    JButton b1, b2; 
    String str3=""; 

    public mySwing() { 
     JPanel panel = new JPanel(); 
     b1 = new JButton("please click me first"); 
     b2 = new JButton("please click me second"); 
     final JTextField txt = new JTextField("       "); 
     panel.add(txt); 
     Container pane = getContentPane(); 
     panel.add(b1); 
     panel.add(b2); 
     pane.add(panel); 
     str3 = new String(); 
     b1.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent acv) { 
       str3+=" (1)"; 
       txt.setText(str3); 
      } 
     }); 
     b2.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent acv) { 
       str3+=" (2)"; 
       txt.setText(str3); 
      } 
     }); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new mySwing(); 
    } 
} 
+0

不,它必須是最終才能從內部類訪問 – JavaFan

+1

只有當它是局部變量時它才必須是最終的。當創建一個實例變量時,它可以被內部類訪問而不是最終的。試試吧。或者看看你的按鈕'b1'和'b2'。他們可以被你的內部課程訪問而不是最終的。 – Holger

+0

請更多解釋我不明白你的想法 – JavaFan

0

您將變量str3聲明爲final的方法是正確的。但是,在Java中,字符串不能改變它們的內容,所以你必須做一些不同的事情。有些想法我能遇到:

  1. 使用一個StringBuffer來代替,並將其轉換爲與其中所需要的toString()方法的字符串。
  2. 使用一些其他的POJO與你的String的getter和setter,這樣POJO將被聲明爲final,並且內容可以通過getter和setter來更改。

希望這有助於指導,肯定還有很多其他的好方法。

+0

謝謝。這裏的問題不是字符串成員,而是變化的變量值,所以我會嘗試第二個選項 – JavaFan

0

您的變量STR3是最終的,那麼就永遠不會改變。

你的代碼中你從來沒有試圖改變它,你只是在你的ActionListener內部類中聲明瞭一個新的str3。

+0

查看下面b2.addActionListener(new ActionListener(),爲什麼str3值爲null(我想將它作爲前一個內部類中的值) – JavaFan

+0

final String str3;是您的「final」聲明,意思是str3在過程中永遠不會改變在程序運行之後,你已經初始化了你的str3(str3 = new String()< - new String()return null),並且str3將永遠爲null現在在b1中,你已經聲明瞭另一個str3 (String str3 = new String(input.substring(0,5));)和上面的str3不一樣,如果你嘗試執行str3 =「someString」;編譯器會報錯。現在,b2中的str3指向/指向具有null值的第一個str3,因爲它無法在b1中看到str3,並且它爲空。 –