Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > управление одним окном из другого


Автор: 6y6y9Hr 10.12.2008, 22:38
Здравствуйте

есть код

первое окно:

Код


public class MainFrame extends javax.swing.JFrame {

    public MainFrame() {
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame(this).setVisible(true);
            }
        });
    }

    public void showHello(){
        if(this.jTextField1.isFocusOwner() == true){
            this.jTextField1.setText("Hello");
            this.jTextField2.requestFocus();
        }
        else
            if(this.jTextField2.isFocusOwner() == true){
                this.jTextField2.setText("Hello");
                this.jTextField1.requestFocus();
            }
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
}


второе окно:
Код

public class NewJFrame extends javax.swing.JFrame {

    public NewJFrame(MainFrame MF) {
        this.MF = MF;
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        MF.showHello();
    }

    private javax.swing.JButton jButton1;

    MainFrame MF;
}


Вобщем по нажатию кнопки во втором окне в первом в jTextField1 должно вывестись сообщение Hello и передать фокус в jTextField2. Только вот проблема в 

new NewJFrame(this).setVisible(true)   

this определяется как ошибка 

cannot find symbol 
symbol: constructor NewJFrame(<anonymous java.lang.Runnable>)

Что я делаю не так ??

Автор: comcon1 11.12.2008, 04:01
Скажи мне, нафига тебе поток при клике по кнопке, а?
просто без всяких runnable-ов делай:
Код

new NewJFrame(this).setVisible(true);


Ну если ты оооочень хочешь поток, то так:
Код

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        final MainFrame tmpvar = this;
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame(tmpvar).setVisible(true);
            }
        });
    }

Автор: 6y6y9Hr 11.12.2008, 09:06
Спасибо все работает  smile 

Цитата

Скажи мне, нафига тебе поток при клике по кнопке, а?


В java пока полный нуб... программу делаю в NetBeans который по умолчанию так открывает окно... теперь буду знать  smile 

Автор: math64 12.12.2008, 09:47
Код

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame(MainFrame.this).setVisible(true);
            }
        });
    }

Иногда invokeLater /"вызови позже"/ нужен - поэтому NetBeans его вставляет. При этом новый поток не создается, а создание нового окна откладывается на некоторое время (если у кнопки назначено несколько ActionListener'ов, то новое окно создатся после того, как они все отработают)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)