如何将变量从jtextfield传递到另一个JFrame / class中的另一个变量?

时间:2012-02-08 18:19:08

标签: java swing constructor jtextfield

我遇到了JTextField的问题。我不知道如何将变量从JTextField(位于JFrame A中)传递给另一个JTextField(位于JFrame B中)。 我试图这样做,但它没有做任何事情,即它没有得到任何运行时/编译错误,也没有收到文本。

我尝试在ClassB中执行此操作:

ClassA a = new ClassA();
String text = a.jtextfield1.getText();

但它不起作用!!

你可以用一个简单的例子来帮助我吗?我做错了什么?

p.s。:我正在使用netbeans

[edit - ]这是ClassA的代码:

public class ClassA extends javax.swing.JFrame {

public ClassA() {
    initComponents();
}

public void initComponents() {

    jTextField1 = new javax.swing.JTextField();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jTextField1.setText("Some text blah blah");
    jTextField1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jTextField1ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(33, 33, 33)
            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(124, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(47, 47, 47)
            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(86, Short.MAX_VALUE))
    );

    pack();
}

public static void main(String args[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new ClassA().setVisible(true);
        }
    });
}

public javax.swing.JTextField jTextField1;

}

以下是ClassB的代码:

public class ClassB extends javax.swing.JFrame {

public ClassB() {
    initComponents();
}

  public  ClassA a = new ClassA();


public void initComponents() {

    jTextField1 = new javax.swing.JTextField();
    getText = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    getText.setText("GetText");
    getText.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            getTextActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(31, 31, 31)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGroup(layout.createSequentialGroup()
                    .addGap(50, 50, 50)
                    .addComponent(getText)))
            .addContainerGap(143, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(50, 50, 50)
            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(26, 26, 26)
            .addComponent(getText)
            .addContainerGap(49, Short.MAX_VALUE))
    );

    pack();
}

public void getTextActionPerformed(java.awt.event.ActionEvent evt) {
    a.jTextField1.getText(); //this doesn't work. How can I it makes work?
}

public static void main(String args[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new ClassB().setVisible(true);
        }
    });
}

public javax.swing.JButton getText;
public javax.swing.JTextField jTextField1;

}

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果您实例化一个新的ClassA实例(并且,BTW,语法为new ClassA()),那么您将拥有一个新实例,另一个jtextfield1不是现有ClassA实例中的实例。您需要将对现有ClassA实例的引用传递给ClassB实例:

构建ClassB时:

ClassB theClassB = new ClassB(theClassA);

您似乎并不掌握类和对象的基本OO概念,甚至不掌握Java的语法。我建议不要现在使用Swing,并首先学习基础知识。 Swing很难,对于不理解这些概念的开发人员来说太难了。

阅读Java tutorial

的基础知识和OO课程

答案 1 :(得分:1)

你问一个简单的例子,你会得到一个。我告诉你如何在你的代码上匹配这个例子,这应该不会太困难。

public class PanelWithTextField extends JPanel{
  private JTextField textField = new JTextField();
  public JTextField getTextField(){ return textField; };
}

public static void main( String[] args ){
  EventQueue.invokeLater(){ new Runnable(){
    public void run(){
      //create a first panel
      PanelWithTextField panel = new PanelWithTextField();
      panel.getTextField().setText( "Some text" );
      //create a second panel
      PanelWithTextField anotherPanel = new PanelWithTextField();
      //copy the text from the first panel's textfield to the second panel's textfield
      anotherPanel.getTextField().setText( panel.getTextField().getText() );
    }
  }
}

我希望我没有写太多拼写错误,因为我没有尝试运行它,也没有使用我的IDE来编写这段代码。

基本上,您需要在第二个面板中(或在您访问该文本字段的代码的任何部分)引用您的第一个面板。

正如其他人已经建议的那样。在开始搞乱Swing和UI之前,首先要确保理解基本的OO概念和基本的Java语法