2016-01-09 5 views
-1

У меня есть 3 диалога, которые отображаются вместе в моем проекте.Проблема с диалоговой способностью в Swing в java 1.6

  • Первый диалог является немодальным с setVisibleOnTop(false).
  • Второй диалог немодальный с setVisibleOnTop(true).
  • Третий диалог - Модификация приложения с setVisibleOnTop(true).

Теперь вопрос:

  1. В идеале, когда есть диалог «третий» открыт с APPLICATION_MODAL собственности, то никакой другой JComponent не должен принимать щелчок. Это отлично работает с java 1.7.
  2. С помощью java 1.6 я нажимаю на диалог «один», затем диалог «второй» идет в конце диалога «один». В то время как диалог «третий» все еще открыт.

Теперь вопрос:

  • Почему диалог «один» выходит вперед, когда есть диалог APPLICATION_MODAL (третий) был открыт?
  • Почему второй диалог с недвижимостью setAlwaysOnTop(true) идет сзади?
  • Я считаю, что это проблема с java 1.6. Кто-нибудь знает об этом?
  • Является ли эта ошибка документирована где-то?

Пример кода:

import java.awt.Frame; 

import javax.swing.JDialog; 
class MyDialog1 extends JDialog { 

    MyDialog1() 
    { 
     super(); 
     super.setVisible(false); 
     setTitle("one"); 
    } 


} 


class MyDialog2 extends JDialog { 

    MyDialog2() 
     { 
     super(null,ModalityType.MODELESS); 
      setAlwaysOnTop(true); 
      setTitle("second"); 

     } 

    } 


class MyDialog3 extends JDialog { 

    MyDialog3() 
    { 
     super(new Frame(),ModalityType.APPLICATION_MODAL); 
     setTitle("third"); 
     setAlwaysOnTop(true); 
     super.setVisible(false); 

    } 

} 

public class ModalityIssue { 

    public static void main(String args[]) 
    { 
     MyDialog1 d1=new MyDialog1(); 
     d1.setSize(600, 600); 

     MyDialog2 d2=new MyDialog2(); 
     d2.setSize(500, 500); 

     MyDialog3 d3=new MyDialog3(); 
     d3.setSize(400, 400); 

     d1.setVisible(true); 
     d2.setLocationRelativeTo(d1); 
     d2.setVisible(true); 
     d3.setLocationRelativeTo(d2); 
     d3.setVisible(true); 
    } 
    } 
+0

потому что есть awt.Frame – mKorbel

ответ

1
  • Dont использовать AWT компоненты

  • JFrame игнорирует AlwaysOnTop и модальность,

  • использование Initial резьбы,

  • важно код заказа слишком

  • вы можете использовать Aplication модальности (похоже, как лучше, но никто не знает, если встречается с требованием/с)

  • MyDialog1 всегда мигает (MyDialog2 окрашена перед тем MyDialog1, то прыжки опережать MyDialog2, обычные пользователи не могут поймать, что), может быть, нет никаких JComponents добавлены к любому из верхнего уровня контейнеров в текущем JVM

, например (Java 1.6.21/025/031 , то же самое работает в 1.7.04 и 1.8.60/66/win10)

import java.awt.Dialog.ModalityType; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

class MyDialog1 extends JDialog { 

    public MyDialog1() { 
     super(null, ModalityType.MODELESS); 
     setAlwaysOnTop(true); 
     setTitle("fist"); 
    } 
} 

class MyDialog2 extends JDialog { 

    public MyDialog2() { 
     super(null, ModalityType.MODELESS); 
     setAlwaysOnTop(true); 
     setTitle("second"); 
    } 
} 

public class ModalityIssue { 

    private JFrame frame = new JFrame(); 
    private MyDialog1 d1 = new MyDialog1(); 
    private MyDialog2 d2 = new MyDialog2(); 

    public ModalityIssue() { 
     frame.setTitle("third"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 300); 
     frame.setLocation(100, 100); 
     frame.setVisible(true); 

     d1.setSize(400, 300); 
     d1.setLocation(200, 200); 
     d1.setVisible(true); 

     d2.setSize(400, 300); 
     d2.setLocation(300, 300); 
     d2.setVisible(true); 
    } 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new ModalityIssue(); 
      } 
     }); 
    } 
}