2011-10-17 22 views
1

我有一個JFrame內的應用程序創建一個JPanel如下:引用的JPanel組件

public class Frame1{ 
    public Frame1(){ 
     Frame2 f2 = new Frame2(); 
     f2.pack(); 
     f2.setVisible(true); 
    } 

    class Frame2 extends JFrame{ 
     public Frame2(){ 
      JPanel p1 = new JPanel(); 
      JTextField txt1 = new JTextField("Test",12); 
      p1.add(txt1); 
      JButton btn1 = new JButton("Click Me!"); 
      p1.add(btn1); 
      add(p1); 
      btn1.addActionListener(this); 
     } 
     public void actionPerformed(ActionEvent e){ 
      JOptionPane.showDialog(null,text of the textbox); 
     } 
    } 
} 

有引用文本字段,即使它不是一個字段變量的一種方法,它只是在構造函數中聲明(this.getRootPane().getParent()會給我框架我相信,但我從哪裏去)?

+2

如果需要引用它,爲什麼不使它成爲非靜態類字段?或者找到一些其他乾淨的方法來獲取其參考,例如將它放置在非靜態字段的地圖或集合中? –

回答

3

再次重申,爲什麼不只是讓你的JTextField類的民辦非靜態字段:

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

public class Frame1 { 
    public Frame1() { 
     Frame2 f2 = new Frame2(); 
     f2.pack(); 
     f2.setVisible(true); 
    } 

    class Frame2 extends JFrame implements ActionListener { 
     private JTextField txt1; 

     public Frame2() { 
     JPanel p1 = new JPanel(); 

     // JTextField txt1 = new JTextField("Test", 12); 
     txt1 = new JTextField("Test", 12); 

     p1.add(txt1); 
     JButton btn1 = new JButton("Click Me!"); 
     p1.add(btn1); 
     add(p1); 
     btn1.addActionListener(this); 
     } 

     // if outside classes need to see the text 
     public String getTxt1Text() { 
     return txt1.getText(); 
     } 

     public void actionPerformed(ActionEvent e) { 
     JOptionPane.showMessageDialog(this, txt1.getText()); 
     } 
    } 
} 
2

如果你想獲得你宣佈它只是在構造函數中一個JTextField的引用,那麼你唯一的選擇是使用主JFrame的,像這樣得到它:

JTextField textField = (JTextField) ((JPanel) getContentPane().getComponents()[0]).getComponents()[0]; 
JOptionPane.showMessageDialog(null, textField.getText()); 

或者一個通用的解決方案:

private JTextField textField; 

getJTextField(this); // Call this from inside the constructor 

// ... 

private boolean getJTextField(Container c) 
{ 
    Component[] cmps = c.getComponents(); 
    for (Component cmp : cmps) 
    { 
     if (cmp instanceof JTextField) 
     { 
      textField = (JTextField) cmp; 
      return true; 
     } 
     if (cmp instanceof Container) 
     { 
      if(getJTextField((Container) cmp)) return true; 
     } 
    } 
    return false; 
} 

但是,將JTextField聲明爲一個類存檔使您的生活更輕鬆。