2011-06-22 154 views
0

我有一個JTextField和一個名爲Main的類中的按鈕。我在另一個類Action中有一個ActionListener。我希望ActionListener能夠引用JTextField。我不斷收到空指針異常。我想保持JTextField和ActionListener獨立。我將會有很多ActionListeners,並且這樣對我進行組織很容易。Java:在一個類中使用Actionlistener來引用另一個類中的變量

public class Main { 

    public JTextField text; 

    public JTextField getText(){ 
     return this.text; 
    } 

public static void main(String[] args) { 

     Main main=new Main(); 
     main.blah(); 
    } 

public void blah(){ 

    JFrame myWindow=new JFrame("ff"); 
    myWindow.setSize(500,500); 
    myWindow.setVisible(true); 
    myWindow.setDefaultCloseOperation(3); 
    text=new JTextField(10); 
    JLabel lengthL = new JLabel("Enter a number",SwingConstants.CENTER ); 
    JButton button=new JButton("Click button"); 
    myWindow.getContentPane(); 
    myWindow.setLayout(new GridLayout(4,4)); 
    myWindow.add(lengthL); 
    myWindow.add(text); 
    myWindow.add(button); 

    Action hand=new Action(); 
    button.addActionListener(hand); 
} 
} 



public class Action implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Main main=new Main(); 
     double length=Double.parseDouble(main.text.getText()); 
     System.out.println(length); 

    } 
} 

回答

1

我不斷收到一個空指針異常

那是因爲你,當你處理該事件創建一個新的Main實例:

public void actionPerformed(ActionEvent e) { 
    Main main=new Main(); 
    ... 

你最好有動作容器類的引用(Main)以及訪問該文本字段值的方法:

Main aMain; 
    public void actionPerformed(ActionEvent e) { 
    this.aMain.getText(); 
    .... 

甚至更​​好:

public void actionPerformed(ActionEvent e) { 
     double lenght = this.main.getValue();// returns double 
     ... 
+0

我試圖做你的建議,但我仍然得到一個空指針 – clay123

+1

@粘土:那麼你做錯了,但對我們來說更多,你必須展示你如何實施奧斯卡的建議和NPE。我們無法讀懂頭腦。 –

2

當您創建的ActionListener,像這樣爲什麼不通過的JTextField:

public class Action implements ActionListener{ 
    private JTextField text; 

    public Action(JTextField text) { 
     this.text = text; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     double length=Double.parseDouble(text.getText()); 
     System.out.println(length); 
    } 
} 

//in Main: 
public void blah(){ 
    JFrame myWindow=new JFrame("ff"); 
    myWindow.setSize(500,500); 
    myWindow.setVisible(true); 
    myWindow.setDefaultCloseOperation(3); 
    text=new JTextField(10); 
    JLabel lengthL = new JLabel("Enter a number",SwingConstants.CENTER ); 
    JButton button=new JButton("Click button"); 
    myWindow.getContentPane(); 
    myWindow.setLayout(new GridLayout(4,4)); 
    myWindow.add(lengthL); 
    myWindow.add(text); 
    myWindow.add(button); 

    Action hand=new Action(text); //change this line 
    button.addActionListener(hand); 
} 
+0

因爲他希望:* ..保持JTextField和ActionListener獨立... * – OscarRyz

+0

@OscarRyz - 給ActionListener對「Main」實例的引用不會使它們保持獨立,如果有的話它會創建更大的依賴關係,因爲ActionListener僅對與該「Main」類關聯的文本字段有用。通過傳入一個文本字段,ActionListener更具可重用性,它更切合實際地保持類的分離。 – aroth

+0

謝謝。這很好用! – clay123

相關問題