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


Автор: WhoogMan 22.10.2013, 11:46
Как обратиться к форме (вызвать ее метод: свернуть, закрыть или просто цвет фона изменить) из другого компонента или собственного класса?
В C#, Delphi главная форма была доступно из любой части программы, а как это делается в java?

Автор: LSD 22.10.2013, 12:41
Цитата(WhoogMan @  22.10.2013,  12:46 Найти цитируемый пост)
В C#, Delphi главная форма была доступно из любой части программы, а как это делается в java? 

Ссылка на объект сохраняется в статической переменной.

Автор: WhoogMan 22.10.2013, 13:22
а как к ней обращаться?
допустим: создал консольное приложение
Код

public class Framest {

    public static MainFrame frame1; //это моя главная форма
    
    public static void main( String[] args ) {
        frame1 = new MainFrame();
        frame1.setVisible( true );
    }
}

у меня есть класс кнопки
Код

public class MainFrame extends javax.swing.JFrame {

    WndSysBtn btnClose;   //вот кнопка
...
}

и кнопкой я хочу закрыть форму
Код

public WndSysBtn( ... ) {
...

        addMouseListener( new MouseAdapter() {
            @Override
            public void mouseEntered( MouseEvent me ) {
                super.mouseEntered( me );

                frame1 //эту переменную не видно
            }
        } );
    }

Автор: Mirkes 22.10.2013, 14:16
Я в таких случаях использую один из двух вариантов:
1. Если я знаю, что будет только одна форма этого класса, то использую шаблон singleton и внутри класса формы я всегда знаю ссылку на нее. В Вашем случае это вполне подходит.
2. Если я знаю, что ссылка на какую-либо форму потребуется в определенном классе, то я просто ее туда передаю. Либо создаю возможность спросить, где она.

Автор: WhoogMan 22.10.2013, 14:59
1. - Спасибо, много почитал. Ошибок нет, но ощущение будто я обращаюсь не к своей форме
я правильно понял?
моя форма
Код

public class MainFrame extends javax.swing.JFrame {
private static MainFrame instance;
public static MainFrame getInstance() {
        if ( instance == null ) {
            instance = new MainFrame();
        }
        return instance;
    }
}

и затем в обработчике кнопки
Код

MainFrame.getInstance().setBackground( Color.yellow );

2. У меня побольше вложенных классов (панель->панель->панель->кнопка). Тащить внутрь ссылку на форму не хочется

Автор: Mirkes 22.10.2013, 19:28
Вобщем-то верно, единственный вопрос, как форма создается впервые? Если через прямой вызов конструктора, то это не правильно. В правильно реализованном Singletone конструктор private и доступ к классу только через getInstance. Этого в приведенном фрагменте не видно. Если главная форма создается не через getInstance, то вы таки имеете две формы smile

Автор: WhoogMan 23.10.2013, 11:04
это очевидно. Спасибо, работает

Автор: AlexAddams 4.12.2013, 23:40
Обычно в таких случаях, добавляю один слушатель для нескольких объектов, отдельный класс слушатель и add...Listeners(...) метод кнопки, окна, метки и т. д., выполняет одно и тоже действие и в одном месте. Таким образом можно сгруппировать разными слушателями хоть каждый объект по отдельности.

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