2012-06-04 5 views
9

JOptionPanの数を別の状況で表示するDialogUtilを作成しました。 私のアクションクラスでは、以下のようにnullパラメータでこのメソッドを呼び出すことがあります。この場合すべてのウィンドウの上部にJOptionPaneを表示する方法

DialogUtil.showNotExist(null,xml.getName().concat(" is null or")); 

のJOptionPaneは、ウィンドウの上部に表示されていません。

JOptionPaneに何かを追加して、常に上に表示できますか?

public static void showNotExist(JPanel panel, String action) { 
    JOptionPane.showMessageDialog(panel, new JLabel(action.concat(" doesn't exist."), 2)); 
} 
+0

は単にすなわち 'JFrame'、それはメインの容器で聞かせて、代わりにJPanel''で、引数として親を渡します –

+0

* "以下のようなnullパラメータを持つこのメソッドへの私のアクションクラス呼び出し時に" *なぜ 'null'ですか? –

+1

私はこのメソッドを、GUIまたはフレームへの参照を持たないクラスの本体で呼び出すためです。 – itro

答えて

5

可能です問題

  • のJOptionPaneはEDTの外に呼ばれて、その後にのみ、ツールバー、画面上に表示される(ネイティブOSから来たキャプションが画面に表示されている、rootPaneには表示されません)が

  • あなたがすることができますJOptionPane.showInternalMessageDialog()がすべてのケースで問題を引き起こすJOptionPanesの機能をテストするEREは

同じ時間に同じsetModalを持つ別のJDialog(真)、私は知らない本当の理由は、画面上の2つのJOptionPanesを示すにModalityTypes

  • ない可能であるべきであるコード

    import java.awt.event.MouseEvent; 
    import javax.swing.JFrame; 
    import javax.swing.JButton; 
    import java.awt.BorderLayout; 
    import java.awt.Dimension; 
    import java.awt.EventQueue; 
    import java.awt.Toolkit; 
    import java.awt.event.ActionListener; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.MouseAdapter; 
    import javax.swing.JDialog; 
    import javax.swing.JOptionPane; 
    import javax.swing.JRootPane; 
    import javax.swing.Timer; 
    //http://stackoverflow.com/questions/8670297/make-java-swing-modal-dialog-behave-like-mac-osx-dialogs 
    public class ModalDialogDemoFrame extends JFrame { 
    
        private static final long serialVersionUID = 1L; 
        private ModalDialogDemoFrame modalDialogDemo; 
    
        public ModalDialogDemoFrame() { 
         modalDialogDemo = this; 
         setBounds(100, 100, 400, 400); 
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
         JButton buttonDialog = new JButton("Open Dialog"); 
         buttonDialog.addActionListener(new ActionListener() { 
    
          public void actionPerformed(ActionEvent arg0) { 
           // Create a Modal Dialog with this Frame as Parent. 
           ModalDialog modalDialog = new ModalDialog(modalDialogDemo, true); 
           modalDialog.setVisible(true); 
          } 
         }); 
         getContentPane().add(buttonDialog, BorderLayout.CENTER); 
        } 
    
        public static void main(String[] args) { 
         EventQueue.invokeLater(new Runnable() { 
    
          public void run() { 
           try { 
            ModalDialogDemoFrame window = new ModalDialogDemoFrame(); 
            window.setVisible(true); 
           } catch (Exception e) { 
            e.printStackTrace(); 
           } 
          } 
         }); 
        } 
    } 
    //http://stackoverflow.com/questions/4577424/distinguish-between-a-single-click-and-a-double-click-in-java/4577475#4577475 
    class ClickListener extends MouseAdapter implements ActionListener { 
    
        private final static int clickInterval = (Integer) Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval"); 
        private MouseEvent lastEvent; 
        private Timer timer; 
    
        public ClickListener() { 
         this(clickInterval); 
        } 
    
        public ClickListener(int delay) { 
         timer = new Timer(delay, this); 
        } 
    
        @Override 
        public void mouseClicked(MouseEvent e) { 
         if (e.getClickCount() > 2) { 
          return; 
         } 
         lastEvent = e; 
         if (timer.isRunning()) { 
          timer.stop(); 
          doubleClick(lastEvent); 
         } else { 
          timer.restart(); 
         } 
        } 
    
        @Override 
        public void actionPerformed(ActionEvent e) { 
         timer.stop(); 
         singleClick(lastEvent); 
        } 
    
        public void singleClick(MouseEvent e) { 
        } 
    
        public void doubleClick(MouseEvent e) { 
        } 
    } 
    
    class ModalDialog extends JDialog { 
    
        private static final long serialVersionUID = 1L; 
    
        public ModalDialog(JFrame parent, boolean modal) { 
         Dimension dimensionParentFrame = parent.getSize(); 
         setSize(new Dimension((parent == null) ? 300 : dimensionParentFrame.width/2, 75)); 
         Dimension dimensionDialog = getSize(); 
         int x = parent.getX() + ((dimensionParentFrame.width - dimensionDialog.width)/2); 
         setLocation(x, parent.getY() + parent.getInsets().top); 
         //setUndecorated(true); 
         setModal(modal); 
         //setUndecorated(true); 
         //getRootPane().setWindowDecorationStyle(JRootPane.ERROR_DIALOG); 
         setModalityType(ModalityType.APPLICATION_MODAL); 
         setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
         final JButton buttonClose = new JButton("Close"); 
         buttonClose.addActionListener(new ActionListener() { 
    
          public void actionPerformed(ActionEvent e) { 
    //ok 
           /*JOptionPane.showMessageDialog(buttonClose, 
           "Eggs are not supposed to be green.", 
           "Inane warning", 
           JOptionPane.WARNING_MESSAGE);*/ 
    //uncomment for un_handled GUI, JOptionPane is behing JFrame I think.... 
           /*JOptionPane.showInternalMessageDialog(buttonClose, 
           "Eggs are not supposed to be green.", 
           "Inane warning", 
           JOptionPane.WARNING_MESSAGE);*/ 
    //ok 
           /*JOptionPane.showConfirmDialog(buttonClose, 
           "Eggs are not supposed to be green.", 
           "Inane warning", 
           JOptionPane.WARNING_MESSAGE);*/ 
    //ok     
           /*JOptionPane.showMessageDialog(null, 
           "Eggs are not supposed to be green.", 
           "Inane warning", 
           JOptionPane.WARNING_MESSAGE);*/ 
    //uncomment for un_handled GUI 
    //Exception occurred during event dispatching: 
    //java.lang.RuntimeException: JOptionPane: parentComponent does not have a valid parent     
           /*JOptionPane.showInternalMessageDialog(null, 
           "Eggs are not supposed to be green.", 
           "Inane warning", 
           JOptionPane.WARNING_MESSAGE);*/ 
    //ok     
           JOptionPane.showConfirmDialog(null, 
             "Eggs are not supposed to be green.", 
             "Inane warning", 
             JOptionPane.WARNING_MESSAGE); 
           dispose(); 
          } 
         }); 
         add(buttonClose, BorderLayout.CENTER); // comment for listening 
         addMouseListener(new ClickListener() { 
    
          @Override 
          public void singleClick(MouseEvent e) { 
           System.out.println("single"); 
          } 
    
          @Override 
          public void doubleClick(MouseEvent e) { 
           System.out.println("double"); 
          } 
         }); 
        } 
    } 
    
  • +0

    @Downvoter:行為の理由も解釈してください! –

    4

    私が何であるかをWebOptionPaneWebPanel知らないが、彼らはJOptionPaneをもとにしている場合、その問題は、showXXX()メソッドへの最初の引数にnullを渡しているということです。 JOptionPaneをモーダルにする(指定されたウィンドウの前に置く)ようにするには、ウィンドウを指定する必要があります(最初の引数にはJFrame -

    +0

    +1正しい提案 – mKorbel

    +0

    の残りの部分を追加しましたあなたは正しいと私は認識していますが、最初の議論は何ですか、ウィンドウを指定しないとトップになりたいですか? – itro

    +0

    @itro:そして私はユニコーンが欲しい! –

    14

    あなたはこれを試しましたか?

    JOptionPane optionPane = new JOptionPane(); 
    JDialog dialog = optionPane.createDialog("Title"); 
    dialog.setAlwaysOnTop(alwaysOnTop); 
    dialog.setVisible(true); 
    

    オペレーティングシステムによってダイアログが常に上に表示されることは保証されませんが、しばしば機能します。

    既存のウィンドウやダイアログを持っていて、一番上に持って帰りたいと思うが、恒久的にalwaysOnTopを設定しない場合のみalwaysOnTopの古い値を残しながら、これは動作するはずです:

    boolean supported = window.isAlwaysOnTopSupported(); 
    boolean old_alwaysOnTop = window.isAlwaysOnTop(); 
    if (supported) { 
        window.setAlwaysOnTop(true); 
    } 
    window.toFront(); 
    window.requestFocus(); 
    if (supported) { 
        window.setAlwaysOnTop(old_alwaysOnTop); 
    } 
    

    このコードはSwingThread上でのみ実行してください。

    1
    public static void showNotExist(JPanel panel, String action) { 
        JOptionPane.showMessageDialog(rootPane, new JLabel(action.concat(" doesn't exist."), 2)); 
    } 
    

    あなたのクラスは、その後、単に クラスのプロパティsetAlwaysOnTop(true)を設定し、JFrameのを延長した場合showMessageDialogセクション

    1

    における第一の値としてのrootPaneを与えてみてください。 JOptionPane.showMessageDialog(null、 "OKay")より前のコンストラクタ内のどこでも。

    ファイルのコピーやチェックに使用しますが、JFrameは必要ありませんが、JOptionPaneは必要ありません。

    P.S.メインのJFrameが常に上部に表示されないようにするには、ダミーのJFrameを作成するか、プロパティsetAlwaysOnTop(false)をリセットする必要があります。 JOptionPaneの後に

    1

    あなたはこのコードを使用することにより、常に上のJOptionPaneを設定することができます: -

     JFrame jf=new JFrame(); 
         jf.setAlwaysOnTop(true); 
         int response = JOptionPane.showConfirmDialog(jf,"Message", "Title", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); 
    
    関連する問題