我有一个应用程序在JFrame中创建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()
会给我相信的框架,但我从哪里开始) ?
答案 0 :(得分: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());
}
}
}
答案 1 :(得分: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声明为类提交会让您的生活更轻松。