更改JDialogs模态以仅阻止一个JFrame

时间:2014-04-22 09:43:38

标签: java swing modal-dialog jdialog

我有那段代码:

public WaitingDiag(Window mainWindow, String string, JFrame stFrame) {
        dialog = new JDialog(stFrame);
        // dialog.setForeground(new Color(100, 100, 100));
        dialog.setUndecorated(true);
        dialog.setSize(WAITING_DIALOG_WIDTH, WAITING_DIALOG_HEIGHT);
        int x = mainWindow.getX() + (mainWindow.getWidth() - dialog.getWidth())
                / 2;
        int y = mainWindow.getY()
                + (mainWindow.getHeight() - dialog.getHeight()) / 2;
        progressBar.setForeground(new Color(0, 128, 0));
        progressBar.setString("Loading data...");
        Font font = new Font("Serif", Font.BOLD, 12);
        progressBar.setFont(font);
        progressBar.setStringPainted(true);
        progressBar.setIndeterminate(true);
        dialog.getContentPane().add(progressBar);
        dialog.setLocation(x, y);
        dialog.setModal(true);
    }

我的问题是,当dialog出现时,它会阻止所有应用程序,并且它包含在JFrame stFrame(实际上是Tab)中,我只想要阻止TabstFrame),这是怎么回事?

更新

我关注标签的代码是:

maingui.getContentPane().add(mainTabs);   //maingui is a JFrame
mainTabs.addTab("Editor", editorPanel);
Statistics st;  //st extends JFrame
mainTabs.addTab("Statistics", null, st.getContentPane(), null);

1 个答案:

答案 0 :(得分:1)

模态仅适用于Windows,因此您无法使用它来阻止标签,除非您对机制进行彻底检查(并且它是一个非平凡的机制)。

一种选择是在其视图中的选项卡和组件上调用setEnabled(false) - 您的案例中框架的内容窗格。实现取决于当您在选项卡中执行某些操作时对话框是否弹出,如果它弹出,无论您使用哪个选项卡或其他方式。 您可以在对话框的setEnabled覆盖中调用setVisible - 这应该可以提供所需的结果(这不是调用模态的地方,因此在某些情况下它可能会略有不同)。

另一个选项是添加一些鼠标侦听器来手动阻止选项卡和\或其组件视图中的点击。这更加混乱,但更像是模态的行为。

对于对话框的模态,它取决于您是否希望它阻止其父框架 - 其内容窗格显示在选项卡中的框架。请注意,标签与框架之间没有任何关系。