2015-12-09 2 views
0

В моем коде проекта мы используем специальные диалоги. Я сталкиваюсь с некоторыми странными проблемами с ними. У меня есть детский диалог и родительский диалог. В идеале, диалог ребенка переходит в невидимое состояние, когда мы вызываемparent.setVisible(false).Состояние родительского диалога изменено на невидимое, но дочерний диалог все еще остается видимым

Но я вижу странное поведение. Когда я делаю parent.setVisible(false), тогда еще мой дочерний диалог остается видимым, но когда я пытаюсь получить child.isVisible(): он дает мне ложь. Также, когда я пытаюсь вызвать child.setVisible(false), он снова не влияет на видимость родительского диалога.

ПРИМЕЧАНИЕ. Я не могу показать образец кода из-за слишком большой сложности, длины и других внешних проблем API. Также я попытался воспроизвести это с помощью внешних программ, но он работает так, как ожидалось, и проблем не обнаружено.

Я просто хочу знать, знает ли кто-нибудь какой-либо сценарий, в котором детальный диалог управления становится ослабленным, когда мы делаем parent.setVisible(false)?

ответ

1

Я просто хочу знать, кто-нибудь знает какой-либо сценарий, в котором диалог дочерний получить разрыхления, когда мы делаем parent.setVisible (ложь)?

  • для родителей называется SetVisible (ложь) тоже

  • быть уверены, что вы повторно уменьшенное количество Чайлдс, чтобы установить DefaultCloseOparation СПРЯТАТЬ или DISPOSE_ON_CLOSE (по defasult последний контейнер выключить свет, но не действует, если есть модальности между контейнерами)

например

import java.awt.BorderLayout; 
import java.awt.Dialog.ModalityType; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

/** 
* 
* @author user 
*/ 
public class ModalityAndJDialog { 

    private JFrame frame = new JFrame(); 
    private JDialog dialog1; 
    private JDialog dialog2; 
    private JButton button = new JButton("Start Swing Timer"); 
    private JButton button1 = new JButton(); 
    private JButton button01 = new JButton(); 
    private JButton button02 = new JButton(); 
    private Timer timer; 

    public ModalityAndJDialog() { 
     button.setAction(updateCol()); 
     frame.setTitle("JFrame"); 
     frame.add(button, BorderLayout.SOUTH); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setSize(400, 300); 
     frame.setLocation(150, 150); 
     frame.setVisible(true); 
     timer = new javax.swing.Timer(500, updateCol()); 
     timer.setRepeats(false); 
     timer.start(); 
    } 

    private Action updateCol() { 
     return new AbstractAction("Show JDialog") { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (dialog1 == null) { 
        dialog1 = new JDialog(dialog1, ModalityType.APPLICATION_MODAL); 
        dialog1.setTitle("1st. JDialog"); 
        dialog1.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
        button1.setAction(updateCol1()); 
        button01.setAction(updateCol01()); 
        dialog1.add(button1, BorderLayout.SOUTH); 
        dialog1.add(button01, BorderLayout.NORTH); 
        dialog1.pack(); 
        dialog1.setSize(400, 300); 
        dialog1.setLocation(250, 250); 
        dialog1.setVisible(true); 
       } else { 
        EventQueue.invokeLater(() -> { 
         dialog1.setVisible(true); 
        }); 
       } 
      } 
     }; 
    } 

    private Action updateCol01() { 
     return new AbstractAction("Hide JDialog") { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (dialog1 != null) { 
        dialog1.setVisible(false); 
       } 
      } 
     }; 
    } 

    private Action updateCol1() { 
     return new AbstractAction("Show Child JDialog") { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (dialog2 == null) { 
        dialog1.setTitle("2nd. JDialog"); 
        dialog2 = new JDialog(frame, ModalityType.APPLICATION_MODAL); 
        dialog2.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
        button02.setAction(updateCol02()); 
        dialog2.add(button02, BorderLayout.SOUTH); 
        dialog2.pack(); 
        dialog2.setSize(400, 300); 
        dialog2.setLocation(350, 350); 
        dialog2.setVisible(true); 
       } else { 
        EventQueue.invokeLater(() -> { 
         dialog2.setVisible(true); 
         if (!frame.isVisible()) { 
          frame.setVisible(true); 
         } 
        }); 
       } 
      } 
     }; 
    } 

    private Action updateCol02() { 
     return new AbstractAction("Hide JDialog") { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (frame != null) { 
        frame.setVisible(false); 
       } 
       /*if (dialog1 != null) { 
       dialog1.setVisible(false); 
       }*/ 
      } 
     }; 
    } 

    public static void main(String[] args) { 
     try { 
      UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 
      /*UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());*/ 
     } catch (UnsupportedLookAndFeelException | ClassNotFoundException | IllegalAccessException | InstantiationException ex) { 
      System.out.println("[L&F][Exception] " + ex.getMessage()); 
     } 
     EventQueue.invokeLater(() -> { 
      new ModalityAndJDialog(); 
     }); 
    } 
} 
Смежные вопросы