模态框是一种弹出层,弹出后阻塞父窗体,即模态框后面的窗体不能点击,需关闭模态框之后才能操作底层窗体。JavaSwing中使用JDialog来实现。如下图所示,当模态窗体打开时,父窗体处于阻塞状态,父窗体内的按钮/文本框等元素均不可点击。
实现代码如下
public static void main(String[] args) {
JFrame frame = new JFrame("父窗体");
frame.setSize(700, 600);// 设置宽高
frame.setLocationRelativeTo(null);// 在屏幕中间显示
frame.setVisible(true);// 设置窗体可见
//这个构造函数里的frame是被阻塞的父窗体对象,第三个true是以模态形式打开,阻塞父窗体
JDialog dialog = new JDialog(frame, "模态窗体", true);
dialog.setBounds(100, 100, 200, 300); // 设定位置和大小
dialog.setLocationRelativeTo(frame);// 相对父窗体居中显示
dialog.add(new JLabel("文本"));//模态框里的元素
// 这句一定要放在最后,不然模态内部的元素和事件都不生效
dialog.setVisible(true);// 模态窗体可见
}
需要注意的是,模态窗体setVisible(true)这句一定要写在模态框内所有元素都渲染完毕之后(包括添加元素、绑定事件等),当内部元素相关代码都写完之后再调用setVisible(true),否则内部元素不显示,绑定事件也不生效。如下代码因为先调用了setVisible(true),所以模态窗体内部的JLabel元素不显示: