2014-02-08 2 views
0

У меня есть два JFrames с именем first и second соответственно. Оба фрейма имеют jtextfields для getText() и setText(). Я могу setText от первого до второго JFrame, но не смог setText от второго до первого.Невозможно setText() в JTextField из другого JFrame

В первом и втором кадре я сделал все public static текстовых полей JTextField

first.java

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    second sec = new second(); 
    sec.jTextField1.setText(this.jTextField1.getText()); // this works 
    sec.jTextField2.setText(this.jTextField2.getText()); 
    sec.setVisible(true); 

    public static javax.swing.JTextField jTextField1; 
    public static javax.swing.JTextField jTextField2; 
    private javax.swing.JButton jButton1; 

second.java

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    first f = new first(); 
    f.jTextField1.setText(this.jTextField3.getText()); //not working 
    f.jTextField2.setText(this.jTextField4.getText()); 
    } 
    public static javax.swing.JTextField jTextField1; 
    public static javax.swing.JTextField jTextField2; 
    public static javax.swing.JTextField jTextField3; 
    public static javax.swing.JTextField jTextField4; 
    private javax.swing.JButton jButton1; 

на нажатие второй кнопки кадров первый кадр должен обновляться , Я не хочу снова открывать первый кадр.

+0

Но ваше и имя класса имя !! ? –

+0

Вы используете netbeans? – Ashish

+0

есть. и имена классов «first» и «second» –

ответ

0

Если вы «не хотите открывать первый кадр снова», вы должны избегать создания нового экземпляра первого и вместо этого использовать ссылку своего предыдущего экземпляра.

Значит, вам нужна ссылка ...один из способов, чтобы дать свою вторую ссылку на первую, это предоставить его в конструкторе, как:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){           
    second sec = new second(this); //notice I'm passing a reference to this as an argument second's contstructor 
    sec.jTextField1.setText(this.jTextField1.getText()); // this works 
    sec.jTextField2.setText(this.jTextField2.getText()); 
    sec.setVisible(true); 

Затем вам нужно сохранить ссылку на первую в своем втором классе и использовать его для доступа к текстовым полям:

private first f; 
public second(first referenceToFirst){ 
    this.f=referenceToFirst; 
} 

ОК, а затем использовать ф поле вместо инстанцирования нового первого при нажатии кнопки на секунду ...

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){           
    //first f = new first(); //don't instantiate a new first, use the one you got in the constructor 
    f.jTextField1.setText(this.jTextField3.getText()); 
    f.jTextField2.setText(this.jTextField4.getText()); 
} 

Примечание:

Я бы не стал публиковать статические текстовые поля, я бы предпочел предоставить методы getter.

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

+0

_ «Я бы не делал текстовые поля общедоступными, я бы предпочел предоставить методы getter». _ ** 'public static' НЕ ИМЕЕТ! ** –

1

Перед тем, как начать, посмотрите на The Use of Multiple JFrames, Good/Bad Practice?`

«по щелчку вторых кадров Кнопка первого кадра должна обновляться. Я не хочу, открытый первый кадр снова.»

Это не работает, потому что вы создаете новый JFrame (first). Из курс он собирается открыть новый кадр. Вместо того, чтобы создавать новый кадр, передайте его в качестве ссылки.

Я приведу вам пример, используя JDialog вместо JFrame. Если после того, как вы прочтете приведенную выше ссылку и все еще решите, что JFrame - это то, что вы хотите, тот же код может быть реализован в JFrame. Они в основном имеют те же конструкции.

Так что в основном я имею в виду, передавая ссылку. Передайте JFrame конструктору JDialog. Таким образом, вы пройдете к нему JFrame, будет тот же ссылочный JFrame.

public class MyDialog extends JDialog { 
    private First frame; 
    private JTextField thisTextField; 

    public MyDilaog(final First frame, boolean modal) { 
     super(frame, modal); 
     this.frame = frame; 

     thisTextFiled = new JTextField(20); 
    } 
} 

Int вашего First класса просто создать его, как этот

MyDialog dialog = new MyDialog(First.this, true); 

Теперь у вас есть ссылка на кадр. Вы также хотите получить getter в классе JFrame, который получит доступ к JTextField от класса JFrame. Затем вы можете установить его текст, так как он также ссылается. Таким образом, вы можете сделать что-то подобное из JDialog

public void actionPerformed(ActionEvent e) { 
    String text = thisTextField.getText(); 

    JTextField fieldFromFrame = frame.getTextField(); 
    fieldFromFrame.setText(text): 
} 

Кроме того, вам нужно использовать Java именования. Названия классов имеют заглавную букву. Таким образом, First не first

+0

что такое 'frame.getTextField();' какой тип метода это. –

+0

Если вы прочтете полный ответ, вы заметили бы, что я сказал, чтобы создать этот метод в классе JFrame, который вернет текстовое поле, которое вы хотите изменить. –

0

пытается PASSE своего второго JFrame в качестве параметра в первом JFrame, чем использовать его, чтобы изменить ваше текстовое поле

Смежные вопросы