我有那段代码:
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
)中,我只想要阻止Tab
(stFrame
),这是怎么回事?
更新
我关注标签的代码是:
maingui.getContentPane().add(mainTabs); //maingui is a JFrame
mainTabs.addTab("Editor", editorPanel);
Statistics st; //st extends JFrame
mainTabs.addTab("Statistics", null, st.getContentPane(), null);
答案 0 :(得分:1)
模态仅适用于Windows,因此您无法使用它来阻止标签,除非您对机制进行彻底检查(并且它是一个非平凡的机制)。
一种选择是在其视图中的选项卡和组件上调用setEnabled(false)
- 您的案例中框架的内容窗格。实现取决于当您在选项卡中执行某些操作时对话框是否弹出,如果它弹出,无论您使用哪个选项卡或其他方式。
您可以在对话框的setEnabled
覆盖中调用setVisible
- 这应该可以提供所需的结果(这不是调用模态的地方,因此在某些情况下它可能会略有不同)。
另一个选项是添加一些鼠标侦听器来手动阻止选项卡和\或其组件视图中的点击。这更加混乱,但更像是模态的行为。
对于对话框的模态,它取决于您是否希望它阻止其父框架 - 其内容窗格显示在选项卡中的框架。请注意,标签与框架之间没有任何关系。