Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обратится из обработчика кнопки к фрейму, на котором расположена кнопка 
:(
    Опции темы
susanin
Дата 26.7.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 7



не могу никак разобраться.. у меня сделано окно.. на нем кнопка.. мне надо из обработчика нажатия на эту кнопку обратится к форме чтобы сичтать текст с формы.. как это сделать?
PM MAIL   Вверх
goodday1941
Дата 26.7.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 8
Всего: 9



ну листенеры обычно внутнениние класы, потому им доступня все переменные класа родителяююю
то есть если тебе нужно стянуть инфу с текстарии, то выносиш ее как переменную класа
Код

private JTextArea txt;

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

общий вид что-то по типу

Код

public Test extends JFrame {
private JTextArea txt;

   public Test(){
... игициализация фрейма

...далее добавлениелистенеров и тут
button.addActionListener(new TestListener());
}

private class TestListenet implements ActionListener{
public void actionPerformed(ActionEvent ae){
text.getText();
}
}

}


Добавлено @ 22:32
это все конечно имеет смысл если ты писал о Swing  smile 

Это сообщение отредактировал(а) goodday1941 - 26.7.2008, 22:35


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
susanin
Дата 26.7.2008, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 7



дело в том что у меня класс обработчика открытый, отдельно от класса фрэйма... как быть в этом случае?
PM MAIL   Вверх
goodday1941
Дата 26.7.2008, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 8
Всего: 9



все просто, в класс обработчика передай нужные параметры:

Код

public class Listener implements ActionListener(){
private JTextArea text;

public Listener(JTextArea text){
this.text=text;
}

public void actionPerformed (ActionEvent ae){
text.getText();
}

}


Добавлено @ 23:02
при добавлении листенера тогда будет что-то такое:

Код

JTextArea text = new JTextArea();
button.addActionListener(new Listener(text)); 


Это сообщение отредактировал(а) goodday1941 - 26.7.2008, 23:03


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
susanin
Дата 27.7.2008, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 7



goodday1941 и что мы получим?? либо я не допонимаю чего то... смотрите.. у меня есть форма с полем textField... на этой форме есть кнопка. при нажатии этой кнопки должна вызываться функция которая будет обрабатывать текст из TextField..функцию эту можно вызвать от формы только.. т.е. как пример MainForm.PerformFunction()... так вот мне надо чтобы этот вызов как то сделать при нажатии на кнопку..т.е. надо как то через обработчик нажатия обратится в главное форме и вызвать функцию PerformFunction(). вообще форма создается в методе main()... т.е. в main содержитяс одна строчка MyForm MainForm = new MyForm(); ..все остальное должно происходить в обработчике нажатия на кнопку и в других функциях...
PM MAIL   Вверх
dorogoyIV
Дата 27.7.2008, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



я  так понял - что ты просто не можешь найти ссылку на класс.
это делается так: YourClass.this
PM MAIL   Вверх
ecologist
Дата 27.7.2008, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: нет
Всего: 9



Можно еще так - кнопка знает всегда, на ком она расположена - getParent. А само событие всегда содержит ссылку на того, кто это событие порождает - event.getSource().

Т.е. твой обработчик может получить ссылку на родителя того, кто послал собощение - ((JButton)event.getSource()).getParent()
PM MAIL   Вверх
dorogoyIV
Дата 27.7.2008, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



ecologist, это тоже вариант, только неудобный.
кнопка может лежать на какой нибудь панели, эта панель может лежать на другой панели, и т.д. ...
PM MAIL   Вверх
goodday1941
Дата 27.7.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 8
Всего: 9



Цитата(susanin @  27.7.2008,  00:52 Найти цитируемый пост)
goodday1941 и что мы получим?? либо я не допонимаю чего то... смотрите.. у меня есть форма с полем textField... на этой форме есть кнопка. при нажатии этой кнопки должна вызываться функция которая будет обрабатывать текст из TextField..функцию эту можно вызвать от формы только.. т.е. как пример MainForm.PerformFunction()... так вот мне надо чтобы этот вызов как то сделать при нажатии на кнопку..т.е. надо как то через обработчик нажатия обратится в главное форме и вызвать функцию PerformFunction(). вообще форма создается в методе main()... т.е. в main содержитяс одна строчка MyForm MainForm = new MyForm(); ..все остальное должно происходить в обработчике нажатия на кнопку и в других функциях... 

ну передай тогда форму в обработчик, принцип тот же (dorogoyIV уже написал) тогда тебе будут доступны все паблик методы и паблик переменные (от них лучше сразу избався smile ) твоего класса фрейма
Цитата(ecologist @  27.7.2008,  09:24 Найти цитируемый пост)
Т.е. твой обработчик может получить ссылку на родителя того, кто послал собощение - ((JButton)event.getSource()).getParent() 

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

Это сообщение отредактировал(а) goodday1941 - 27.7.2008, 12:02


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
susanin
Дата 31.7.2008, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 7



вобщем сделал я, что в обработчик события передается сам фрэйм... вот пример.. все это сделано в классе кнопки
ButtonListener action = new ButtonListener(frame);
addActionListener(action);

но вот проблема... я хотел вместо frame передавать в конструктор this.getParent()...(тем самым получить ссылку на панель, на которой расположена кнопка) но this.getParent() возвращает Container... как можно преобразовать этот тип в какой нибудь другой? чтобы получить хотя бы Panel...
PM MAIL   Вверх
goodday1941
Дата 31.7.2008, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 8
Всего: 9



Код

(JPanel)this.getParent().getParent() 
попробуй.. поидее получишь то что тебе нужно.. но это уже бредовенько выглядит

Добавлено через 2 минуты и 11 секунд
а вообще вроде как панель на фрейме находится... значит передай в обработчик сразу панель

Это сообщение отредактировал(а) goodday1941 - 31.7.2008, 12:01


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
susanin
Дата 31.7.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 7



Цитата(goodday1941 @  31.7.2008,  12:00 Найти цитируемый пост)
попробуй..

ну я и сам так думал... попробовал, но вот такие ошибки вылезли..
Exception in thread "main" java.lang.NullPointerException
        at form.Button.<init>(Button.java:27)
        at form.Panel.<init>(Panel.java:24)
        at form.Frame.<init>(Frame.java:21)
        at form.Interface.<init>(Interface.java:17)
        at result.PrintResult.main(PrintResult.java:23)

как бы от них избавится?*

PM MAIL   Вверх
dorogoyIV
Дата 1.8.2008, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



susanin, чего ты мучаешься?
ссылку ты можешь получить прямо в обработчике
Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Susanin extends JFrame
{
 public Susanin()
 {
  setLayout(new FlowLayout());
  add(new SusaninPanel());
 }

 public static void main(String [] args)
 {
  JFrame f = new Susanin();
  f.setBounds(100, 100, 400, 300);
  f.setDefaultCloseOperation(3);
  f.setVisible(true);
 }
}

class SusaninPanel extends JPanel
{
 SusaninPanel()
 {
  setBackground(Color.YELLOW);
  setPreferredSize(new Dimension(200, 200));
  add(new SusaninButton("Susanin"));
 }
}

class SusaninButton extends JButton
{
 SusaninButton(String s)
 {
  super(s);
  addActionListener(new SusaninAction());
 }
}

class SusaninAction implements ActionListener
{
 public void actionPerformed(ActionEvent e)
 {
    //вот тебе ссылка на твою панель
  SusaninPanel panel = (SusaninPanel)((SusaninButton)e.getSource()).getParent();

   //здесь что то делаем (я просто добавил JLabel)
  panel.add(new JLabel(panel.getClass() + ""));

    //здесь обновляется твоя панель
  panel.validate();
 }
}

PM MAIL   Вверх
susanin
Дата 5.8.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 7



у меня в принципе все нормально..просто непонятки с методом getParent().... у меня в конструктор обработчика передается панель... сам обработчик создается и добавляется в конструкторе кнопки...
Код

public Button() {
   setText("Ok");
   ClickButton action = new ClickButton(this.getParent()); // вот здесь надо передать в обработчик 
                                                                                         //ссылку на панель на которой находится
                                                                                        //кнопка
   addActionListener(action);
}

но метод getParent() в моем случае почему то возвращает null... что неправильно делаю?

Это сообщение отредактировал(а) susanin - 5.8.2008, 12:57
PM MAIL   Вверх
fixxer
Дата 5.8.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 15
Всего: 27



Мне кажется неправильным сама идея размещения бизнес-метода по обработке содержимого поля в классе формы. За это должен отвечать отдельный класс, вот он и должен передаваться в Action.


--------------------
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.