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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как вернуть результат из модального диалога? 
:(
    Опции темы
4epT
Дата 30.5.2010, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день! Делаю модальный диалог (наследую класс от JDialog). Как узнать что окно было закрыто?

что то вроде такого:

Код

if( dialog.show() == DialogResult.OK)
{
....
}



и как вернуть те значения что я ввел в нем?

Что то вообще не могу понять как это реализовывать на Java =(((
PM MAIL   Вверх
powerOn
Дата 30.5.2010, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 31
Всего: 159



Реализуй get методы у своего диалога, которые будут возвращать значения:
Код

if(dialog.show() == DialogResult.OK)
{
    dialog.getValue1();
    dialog.getValue2();
}



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
4epT
Дата 30.5.2010, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



хорошо, а как сделать вот такое ?

Код

if(dialog.show() == DialogResult.OK)


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

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


Опытный
**


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

Репутация: 1
Всего: 5



Начнем с того, зачем тебе это? Чем не устраивают стандартные JOptionPane#showXXXDialog??? В качестве сообщения ему можно передавать не только строки, но и компоненты.
PM   Вверх
4epT
Дата 1.6.2010, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну допустим я пишу свое окно настроек ... такое ведь довольна таки часто нужно =)
PM MAIL   Вверх
vikjek
Дата 2.6.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



К примеру можно создать свою функцию, которая возвращает нужный результат
Код



public int ShowDialog(){
        setVisible(true);
        return 5; //к примеру
    }


и вызывать ее 

Код

if( dialog.ShowDialog()== DialogResult.OK)
{
....
}

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


Опытный
**


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

Репутация: 1
Всего: 5



Цитата(4epT @  1.6.2010,  11:08 Найти цитируемый пост)
Ну допустим я пишу свое окно настроек ... такое ведь довольна таки часто нужно =) 

Делаешь наследника от панельки, размещаешь на ней все что-нужно, создаешь метод, который возвращает выбранные настроки.
Код

class SettingsPanel extends JPanel {
  public Settings getResult() {
    ...
  }
}

Далее в коде пишешь
Код

if (JOptionPane.showConfirmDialog(<родительское_окошко>, settingsPanel) == JOptionPane.YES_OPTION) {
  Settings s = settingsPanel.getResult();
  ...
}

PM   Вверх
4epT
Дата 3.6.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



aleksandy, спасибо, идею понял!

А скажи пожалуйста как можно присвоить одной кнопке что она будет возвращать результат YES_OPTION, а другой CANCEL_OPTION.

Например как в С# свойство у кнопки DialogResult ...
PM MAIL   Вверх
aleksandy
Дата 3.6.2010, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 5



Цитата(4epT @  3.6.2010,  12:31 Найти цитируемый пост)
как можно присвоить одной кнопке что она будет возвращать результат

Никак, кнопка ничего не возвращает.

Если интересно, как сделать нечто похожее JOptionPane.showXXXDialog(), загляни в исходники класса. Там все просто...
PM   Вверх
vikjek
Дата 3.6.2010, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

А скажи пожалуйста как можно присвоить одной кнопке что она будет возвращать результат YES_OPTION, а другой CANCEL_OPTION.

Например как в С# свойство у кнопки DialogResult ... 


Если как в С#, то примерно так..

Код


public class MyDialog extends javax.swing.JDialog {

    public enum DialogResult {
        OK,
        Cancel,
        None
    }
    //Значение которое необходимо вернуть из диалога
    private DialogResult result = DialogResult.None;

   //кнопки
   private javax.swing.JButton jButton_Cancel;
   private javax.swing.JButton jButton_OK;

    
    public MyDialog(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
    }

    /*
          Здесь код инициализациии прочее...
   */

    //Кнопка ОК
    private void jButton_OKActionPerformed(java.awt.event.ActionEvent evt) {
       
        this.result = DialogResult.OK;
        this.dispose();
    }
    
    //Кнопка Cancel
    private void jButton_CancelActionPerformed(java.awt.event.ActionEvent evt) {
        
        this.result = DialogResult.Cancel;
        this.dispose();
    }
    //Метод возвращающий результат в зависимости от нажатой кнопки
    public DialogResult ShowDialog(){
        this.setVisible(true);
        return this.result;
    }

}



далее 

Код

if( dl.ShowDialog() == DialogResult.OK ){
          ....
}else{
          ...




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


Опытный
**


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

Репутация: 1
Всего: 5



vikjek
в таком случае диалог всегда обязан быть модальным. Иначе ничего не получится...

Код
public static void main(String[] args) {
    MyDialog dl = new MyDialog(null, false);
    System.out.println(dl.ShowDialog().name());
}

PM   Вверх
4epT
Дата 5.6.2010, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

//Метод возвращающий результат в зависимости от нажатой кнопки
    public DialogResult ShowDialog(){
        this.setVisible(true);
        return this.result;
    }


а этот код не вернет сразу результат None ?
PM MAIL   Вверх
aleksandy
Дата 7.6.2010, 04:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 5



Цитата(4epT @  5.6.2010,  10:19 Найти цитируемый пост)
а этот код не вернет сразу результат None ? 

Об этом я и говорю... Если делать так, как предлагает vikjek, тогда нужно позаботиться о том, чтобы диалог нельзя было сделать немодальным.
PM   Вверх
armixx
Дата 19.9.2010, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Код

public class MailForm extends JFrame implements Runnable
{ // Окошко, использующее диалог собственной разработки
   private MParm dlg=null;   private String title=null;
   /** Creates new form MailForm */
   public MailForm(Point p)
   {
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);    
     title="Отправка сообщений"; 
     setTitle(title);    
     setLocation(p); 
    }

   public void run()
   {
      dlg=new MParm();
      // Диалог запускаем модально
      dlg.showDialog(this,title);
      // Здесь что-то делаем по окончании работы диалога.
      // Все переменные класса MParm нам доступны
      // Если класс MParm сделать внешним, то надо как-то думать о получении параметров
      dispose();
    }

   class MParm extends JPanel
   {  private JDialog dlg2;
       private boolean send=false;
       public MParm()
       {
          initComponents(); 
          // Делаем панельку, такую, как нам нужно.
          // С кнопочками, textfieldamи и пр. прибамбасами
        }

       private void initComponents()
       {     
         .....
         jButton1.setText("Отправка");
         jButton1.addActionListener
         ( new ActionListener()
          {
            public void actionPerformed(ActionEvent ev)
            {
               send=true;
               dlg2.setVisible(false);
             }
          }
         );
         jButton2.setText("Выход");
         jButton2.addActionListener
         ( new ActionListener()
          {
            public void actionPerformed(ActionEvent ev)
            {
               send=false;
               dlg2.setVisible(false);
             }
           }
         );
        .....
       }

      public void showDialog(Component parent,String title)
      {
         send=false;
         Frame owner=null;
         if( parent instanceof Frame )
         {
           owner=(Frame)parent;
          }
        else owner=(Frame)SwingUtilities.getAncestorOfClass(Frame.class,parent);

        if( dlg2==null || dlg2.getOwner()!=owner )
        {
          dlg2=new JDialog(owner,title,true);
          dlg2.getContentPane().add(this);
          dlg2.setLocation(owner.getLocation());
          dlg2.setSize(owner.getSize());
         }
        dlg2.setTitle(title);
        dlg2.setVisible(true);
       }
   }


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

    MailForm at=new MailForm(countLoc());
    at.run();


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

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

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


 




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


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

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