JDialog modal = true vs ModalityType.APPLICATION_MODAL

时间:2013-01-15 06:24:56

标签: java swing applet jframe jdialog

最初我在桌面Swing应用程序中使用了以下代码。 MyDialog是内部类,frame是JFrame。

private class MyDialog extends JDialog {
    public MyDialog (String title) {
        super(frame, title, true);
        ...
    }

然后我修改了这段代码以支持桌面和applet。所以它变成了这样。 owber也是JFrameJApplet

 private class MyDialog extends JDialog {
    public MyDialog (String title) {
        super(SwingUtilities.windowForComponent(owner), title, ModalityType.APPLICATION_MODAL);
        ...
    }

问题是我将代码作为桌面运行,但模态行为不同。应用程序启动后,我在任务栏中单击Eclipse,因此应用程序隐藏在Eclipse之后。现在在任务栏中,我单击应用程序图标:

  1. JFrameJDialog会立即显示在Eclipse
  2. 之上 任务栏中的
  3. 有两个选项JFrameJDialog,但是对于这两个选项,只有JDialog出现在Eclipse之上而JFrame没有出现。
  4. JDialod没有以下最适合我的构造函数:

    JDialog(Window owner, String title, boolean modal) 
    

    我尝试了ModalityType的不同字段,但没有一个字段与代码片段#1相同。我的方法有什么问题,为什么行为不同?

    mKorbel的

    UPD

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class WindowForComp {
        private JFrame mainwindow;
        private CustomDialog customDialog;
    
        private void displayGUI() {
            mainwindow = new JFrame("MyFrame");
            customDialog = new CustomDialog(mainwindow, "Modal Dialog", true);
            mainwindow.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
            JPanel contentPane = new JPanel();
            JButton mainButton = new JButton("Just a button");
            mainButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    EventQueue.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            customDialog.setVisible(true);
                        }
                    });
                }
            });
    
            contentPane.add(mainButton);
            mainwindow.setContentPane(contentPane);
            mainwindow.pack();
            mainwindow.setLocationByPlatform(true);
            mainwindow.setVisible(true);
        }
    
        public static void main(String... args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new WindowForComp().displayGUI();
                }
            });
        }
    }
    
    
    class CustomDialog extends JDialog {
        public CustomDialog(JFrame owner, String title, boolean modal) {
            super(SwingUtilities.windowForComponent(owner), title, ModalityType.APPLICATION_MODAL);
            System.out.println(SwingUtilities.windowForComponent(owner));
    
            JPanel contentPane = new JPanel();
            JLabel dialogLabel = new JLabel("I am a Label on JDialog.", JLabel.CENTER);
            contentPane.add(dialogLabel);
            setContentPane(contentPane);
            pack();
        }
    }
    

1 个答案:

答案 0 :(得分:1)

似乎SwingUtilities.windowForComponent(JFrame)返回null,因此对话框没有父级。

SwingUtilities.windowForComponent(JFrame) returns null

现在我使用这种方法,它完美地工作(模态):

public static Window windowForComponent (Component c) {
    if (c instanceof Window) return (Window)c;
    return SwingUtilities.windowForComponent(c);
}