2015-04-16 1 views
1

У меня проблема:Модальное окно поверх модального окна в java swing?

У меня есть основное окно приложения (JFrame), которое заполняет весь экран.
Когда нажимается кнопка, появляется меньшее окно, позволяющее пользователю вводить некоторые данные. Пока пользователь делает это, главное окно не должно прыгать перед ним и не допускать взаимодействия.
Решение: открыть модальный JDialog. Позволяет называть Dialog 1.
Но когда нажата кнопка в этом диалоговом окне, появляется новое окно (да/нет-диалог) .. и, опять же, нужно действовать модально на уже модальном диалоговом окне JDialog 1 Попытка сделать это, второй диалог продолжает исчезать за первым.
Я пробовал сделать Dialog 1 JFrame, но потом, конечно, я потерял «модальный» бит. Forcing Dialog 1, чтобы оставаться в нем, по-прежнему удерживает кнопку главного окна кнопки.
Что мне не хватает? Как я могу разместить модальное окно поворота над другим модальным поворотным окном?

Edit: минимальный пример одного не-реально работающей версии:

Основной класс для открытия:

public class MainWin extends JFrame { 

public MainWin(){ 
    this.setSize(800,800); 
    JButton b = new JButton("click hehe"); 
    this.getContentPane().add(b); 
    b.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      new Dia1(MainWin.this); 
     } 
    }); 
    this.setVisible(true); 
} 

}

Главное окно:

public class MainWin extends JFrame { 

public MainWin(){ 
    this.setSize(800,800); 
    JButton b = new JButton("click hehe"); 
    this.getContentPane().add(b); 
    b.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      new Dia1(MainWin.this); 
     } 
    }); 
    this.setVisible(true); 
} 
} 

First Dialog :

public class Dia1 extends JDialog { 


public Dia1(final JFrame parent){ 
    super(parent, true); 
    this.setSize(400, 400); 
    JButton b = new JButton("click hehe"); 
    this.getContentPane().add(b); 
    this.setVisible(true); 
    b.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      new Dia2(parent); 
     } 
    }); 
} 
} 

Второй Диалог:

public class Dia2 extends JDialog { 


public Dia2(JFrame parent){ 
    super(parent, true); 
    this.setSize(200, 200); 
    JButton b = new JButton("click hehe"); 
    this.getContentPane().add(b); 
    this.setVisible(true); 
} 

} 

PS: Я только что понял: Диалог 2 не спрятался, как я подозревал .. это просто не существует. Скорее всего, потому что родительское окно заблокировано из модального диалога?

+0

показать базовый код пример того, что вы пытались – Sionnach733

+1

* «Что мне не хватает?» * [MCVE] (http://stackoverflow.com/help/mcve) (минимальная Полная Проверяемость пример) или [ SSCCE] (http://www.sscce.org/) (короткий, самосохраненный, правильный пример). –

+0

Добавил MCVE в самую barebone версию, которую я мог бы придумать ... если там будет комбинация JFrame/JDialog/Modal, которая будет делать то, что я хочу? – Layna

ответ

2

Вот MCVE модальности, работающий как рекламируемый.

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

public class ModalOverModal { 

    private JComponent ui = null; 

    ModalOverModal() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui!=null) return; 

     ui = new JPanel(new GridLayout()); 
     ui.setBorder(new EmptyBorder(40,40,40,40)); 

     final JButton b1 = new JButton("Open Modal Dialog"); 
     b1.setMargin(new Insets(40, 200, 40, 200)); 
     ui.add(b1); 

     final JButton b2 = new JButton("Open 2nd Modal Dialog"); 

     ActionListener al1 = new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(b1, b2); 
      } 
     }; 
     b1.addActionListener(al1); 

     ActionListener al2 = new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(b2, "Close Me!"); 
      } 
     }; 
     b2.addActionListener(al2); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       ModalOverModal o = new ModalOverModal(); 

       JFrame f = new JFrame("Modal over Modal"); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

Быстрая обратная связь: работает действительно! Теперь выясняем, почему и как интегрировать :) – Layna

+0

Попытка работать по пути работы JOptionPane сейчас ... – Layna

+0

Хорошо, теперь я не уверен, что делать с этим ответом. Да, это то, что я описал. НО, к сожалению, JOptionPane не имеет возможности иметь никаких кнопок ... * вздыхает *. – Layna

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

  • Нет связанных вопросов^_^