Как я могу передать переменные из jtextfield в другое в другом JFrame/классе?

У меня проблема с JTextField. Я не знаю, как передать переменную из JTextField (находящегося в JFrame A) в другой JTextField (находящийся в JFrame B). Я пытался это сделать, но он ничего не делает, т. е. не получает ошибок времени выполнения/компиляции и не получает текст.

Я пытался сделать это в ClassB:

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

но это не работает!!

Не могли бы вы помочь мне, может с простым примером? Что я сделал не так?

p.s.: я использую netbeans

[править --] Это код 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;

}

Заранее спасибо.


person user1197919    schedule 08.02.2012    source источник
comment
Пожалуйста, опубликуйте больше кода. Мы не можем помочь вам с информацией, которую вы представили до сих пор.   -  person Adel Boutros    schedule 08.02.2012
comment
но это не работает!! это не описание ошибки, скажите, что именно произошло, у вас есть исключение? Который из? Если нет, опубликуйте код, где вы устанавливаете текст.   -  person thermz    schedule 08.02.2012
comment
и ClassA a = new ClassA; НЕ МОЖЕТ работать! Возможно, ClassA a = new ClassA(); будет   -  person thermz    schedule 08.02.2012
comment
да, извините, я написал неправильный ClassA(), однако, когда я говорю, что это не работает, я бы сказал, что программа ничего не отображает, она не улавливает текст и не создает время выполнения/ ошибка компиляции.   -  person user1197919    schedule 08.02.2012
comment
поднял код. пожалуйста, помогите мне!   -  person user1197919    schedule 08.02.2012
comment
Не используйте более 1 кадра в приложении. Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 09.02.2012
comment
Да, я не использую больше 1 кадра в приложении, поэтому я пытаюсь понять, как это сделать. Я разместил SSCCE выше, в первом сообщении.   -  person user1197919    schedule 09.02.2012


Ответы (2)


Если вы создаете экземпляр нового экземпляра ClassA (и, кстати, синтаксис new ClassA()), то у вас будет... новый экземпляр с другим jtextfield1, чем в существующем экземпляре ClassA. Вам нужно передать ссылку на существующий экземпляр ClassA в экземпляр ClassB:

Когда ClassB построен:

ClassB theClassB = new ClassB(theClassA);

Похоже, вы не владеете базовыми концепциями ООП классов и объектов и даже не владеете синтаксисом Java. Я бы посоветовал не использовать Swing сейчас, а сначала изучить основы. Swing сложен, слишком сложен для разработчика, который не понимает этих концепций.

Ознакомьтесь с основами и уроками объектно-ориентированного программирования в руководстве по Java.

person JB Nizet    schedule 08.02.2012
comment
да, я сделал это, жаль, что это не работает! он говорит: конструктор ClassB в классе ClassB не может быть применен к заданным типам; требуется: аргументы не найдены: ClassA - person user1197919; 08.02.2012
comment
Вы не предоставляете какой-либо осмысленный код, а другой диагноз, который у нас есть, заключается в том, что он не работает. Мы не экстра-осознанные. Дайте больше содержания с вашим вопросом. SSCCE был бы полезен. Конечно, у вас должен быть конструктор в классе B, который принимает в качестве аргумента ClassA. Прочитайте учебник по основам. Вам еще слишком рано использовать Swing. - person JB Nizet; 08.02.2012
comment
Хорошо, чувак, я только что добавил код. Помогите пожалуйста мне! Это очень важно для меня! - person user1197919; 08.02.2012
comment
Вы не сделали того, что я предложил в своем ответе. Вы ничего не сможете сделать, если не понимаете основ объектно-ориентированного программирования. Прочтите учебные пособия и/или прочитайте вводную книгу. - person JB Nizet; 09.02.2012

Вы просите простой пример, вы его получите. Я оставляю на ваше усмотрение, как сопоставить этот пример с вашим кодом, что не должно быть слишком сложно.

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 для написания этого кода.

В основном вам понадобится ссылка на вашу первую панель на второй панели (или в любой части кода, где вы должны получить доступ к этому текстовому полю).

И как уже предлагали другие. Вы должны начать с того, что убедитесь, что вы понимаете основные концепции объектно-ориентированного программирования и основной синтаксис Java, прежде чем вы начнете возиться с Swing и пользовательским интерфейсом.

person Robin    schedule 09.02.2012
comment
Спасибо за ответ, но с единственным классом это работает. Проблема в том, что когда у меня есть два разных класса в двух разных файлах (см. основной пост, который я только что отредактировал с кодом), я был бы очень признателен, если бы вы могли помочь мне с вышеупомянутым кодом. правда спасибо однако - person user1197919; 09.02.2012
comment
В чем разница между двумя экземплярами одного класса или двумя экземплярами разных классов. У них должна быть ссылка друг на друга, и тогда они могут вызывать методы другого экземпляра. Базовые вещи ОО, как было сказано ранее - person Robin; 09.02.2012
comment
Да, но, как я написал в своем коде, вы можете видеть, что я создал экземпляр объекта, но он все еще не работает (ничего не отображает) - - person user1197919; 09.02.2012