2009-05-03 38 views
3

我正在建立一個GUI,我需要從表單元素輸入信息並操作信息。這需要我使用一些元素來訪問其他元素。如何使用偵聽器訪問其他元素?

例如,我在它旁邊有一個輸入框(JTextField)和一個按鈕(JButton)。當按下按鈕時,我需要能夠操作輸入到輸入框中的文本。我迄今試圖做的所有事情都已經失敗了。

這是我的代碼是什麼樣子,現在(我已經嵌入我的意見的問題):

public class MyClass 
{ 
    public static void main(String args[]) 
    { 
     // Form elements are in here 
     JTextField myTextField = new JTextField(10); 
     JButton myTextFieldSubmit = new JButton("Submit"); 
     myTextFieldSubmit.addActionListener(new ListenerClass()); 
    } 
} 

class ListenerClass implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     // This is what happens when these elements are used 
     // I need to be able to access the form elements from MyClass in here, but this doesn't seem possible with my current setup 
     // For example, when the Submit button is pressed, I need to be able to myTextField.getText() and edit MyClass members 
     // How should my setup be changed to accommodate these needs? 
    } 
} 

感謝您的幫助!

回答

3

這是一個非常可變的範圍問題。

目前,文本字段和按鈕位於main方法的範圍內,因此爲ActionListener分配一個類將意味着它將無法訪問這些變量。

有實現這幾個方面:

(1)請在MyClass一個內部類ListenerClass,並打開myTextFieldmyTextFieldSubmitMyClass實例字段。

public class MyClass 
{ 
    final static JTextField myTextField = new JTextField(10); 
    final static JButton myTextFieldSubmit = new JButton("Submit"); 

    public static void main(String args[]) 
    { 
    myTextFieldSubmit.addActionListener(new ListenerClass()); 
    } 

    static class ListenerClass implements ActionListener 
    { 
    public void actionPerformed(ActionEvent e) 
    { 
     myTextField.setText(""); 
    } 
    } 
} 

(2)請在main方法的匿名內部類,這也讓myTextFieldmyTextFieldSubmit留在同一個地方,只要他們被聲明final

public class MyClass 
{ 
    public static void main(String args[]) 
    { 
    final JTextField myTextField = new JTextField(10); 
    final JButton myTextFieldSubmit = new JButton("Submit"); 

    myTextFieldSubmit.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) 
     { 
      myTextField.setText(""); 
     } 
    }); 
    } 
} 

(3)使本地類,它是本地的main方法。同樣,這將需要聲明文本字段和按鈕final以允許從內部類訪問。

public class MyClass 
{ 
    public static void main(String args[]) 
    { 
    final JTextField myTextField = new JTextField(10); 
    final JButton myTextFieldSubmit = new JButton("Submit"); 

    class ListenerClass implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
     myTextField.setText(""); 
     } 
    } 

    myTextFieldSubmit.addActionListener(new ListenerClass()); 
    } 
} 

(4)漢鼎一個參考ListenerClass,例如在構造函數中,並且也使myTextFieldmyTextFieldSubmit一個實例變量。

public class MyClass 
{ 
    JTextField myTextField = new JTextField(10); 
    JButton myTextFieldSubmit = new JButton("Submit"); 

    public MyClass() 
    { 
    myTextFieldSubmit.addActionListener(new ListenerClass(this)); 
    } 

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

class ListenerClass implements ActionListener 
{ 
    MyClass myClass; 

    public ListenerClass(MyClass myClass) 
    { 
    this.myClass = myClass; 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
    myClass.myTextField.setText(""); 
    } 
} 

(5)進行myTextFieldmyTextFieldSubmitstatic領域,並允許從ListerClass直接訪問。

public class MyClass 
{ 
    static JTextField myTextField = new JTextField(10); 
    static JButton myTextFieldSubmit = new JButton("Submit"); 

    public static void main(String args[]) 
    { 
    myTextFieldSubmit.addActionListener(new ListenerClass()); 
    } 
} 

class ListenerClass implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
    MyClass.myTextField.setText(""); 
    } 
} 

還有可能有更多的方法來實現這一點,並可能有更好的方法來實現這一點。您選擇哪種方法確實取決於應用程序的期望設計。

+0

謝謝!我打算使用(2),因爲我認爲這是最簡單的方式(至少對我來說)。 :) – 2009-05-03 03:32:47

0

您可以在構造函數中將參考MyClass傳遞給ListenerClass

0

您的問題在Java中用於任何目的的偵聽器都很常見:如何讓處理程序訪問通知偵聽器或其同級的對象。

通常有兩個約定。

一個是直接從事件對象獲取對象。你可以用getSource()來做到這一點。但是,你只會得到做它的小部件。

另一種選擇是讓偵聽器類能夠訪問小部件。一種方法是使用非靜態內部類(這取決於你如何聲明它),在這種情況下,它允許訪問包含類的成員。

但是,在這種情況下,您的小部件是變量,而不是成員(您確定要這樣做嗎?)。所以你唯一的解決方案是讓成員把它們放在Listner類中,然後不要在addListener調用中創建監聽器,而是創建一個監聽器,傳遞相關的小部件,並添加監聽器。監聽器現在可以通過存儲在成員中的對他們自己的引用來訪問這些小部件。

相關問題