作者sbrhsieh (sbr)
看板java
标题Re: [问题] 让两个JFrame互斥(一次只能Enabled一个 …
时间Sun Jun 7 14:48:25 2009
※ 引述《kkman0120 (kk)》之铭言:
: 我目前有两个JFrame a跟b
: a是主要的Frame
: 是整个程式流程的主Frame...
: 我想在某个事件发生後才呼叫b这个frame
: 然後b被呼叫时a不可以被使用...
: 等到b视窗被关闭後才可以继续使用a
: 我是有在b被唤起的那段程式码上下各用a.setEnable(false) 跟setEnable(true)
: 去包住b的那行程式码
: 可是这样还是没有用
可以改用 modal dialog 来实做 b 的部分。
一个 java.awt.Dialog/javax.swing.JDialog 的 modal property 设定为 true
後(必须在 dialog 成为 displayable 之前)就成了 modal dialog。
当 modal dialog 成为 visible(执行 setVisible(true) 操作),calling thread
会 block 直到 dialog 被 dispose or hide。而且 modal dialog 出现时也会使得
其 owner frame/dialog/window 变成无法操作。
从 JRE 1.6 开始,modal 模式还可细分为三种:
application modal
document modal
toolkit modal
其差异可以等到你有需要时再去看。
你先跑一下这个简单的 demo code,看看是否就是你想要的效果。
package demo.swing;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class UsingModalDialog {
public static void main(String[] args) {
final JFrame frm = new JFrame("Main Frame");
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton button = new JButton("Click Me");
frm.getContentPane().add(button, BorderLayout.SOUTH);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JDialog dialog = new JDialog(frm);
dialog.setModal(true);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setTitle("I am a modal dialog.");
dialog.getContentPane().add(
new JLabel("Try to click the button in the main frame."));
dialog.setSize(300, 300);
dialog.setLocationRelativeTo(frm);
dialog.setVisible(true); // block here until dialog is
// disposed/hidden
System.out.println("You close the dialog.");
}
});
frm.setSize(400, 400);
frm.setLocationRelativeTo(null);
frm.setVisible(true);
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.173.138.178
1F:→ zeat:哦哦, 看起来不错!! 06/07 14:50
2F:推 kkman0120:感谢 但是能否请问一下假如我的,main里就是A这个Frame 06/07 15:34
3F:推 kkman0120:的程序内容的话 那该怎麽改? 06/07 15:36
4F:推 kkman0120:这的确是我要达到的功能QQ 06/07 15:38
5F:推 kkman0120:谢谢你 我会了 关键是dialog.setModal(true);这样就ok了 06/07 16:16