1.引子
在使用swing组件时,我们想要在同一个窗口切换不同的界面,这时可能就要用到选项卡JTabbedPane对象。
2.详解
有在同窗口进行子页面的切换这样的需求时,我们第一选择就是使用JTabbedPane,不要问为什么,因为其他方式都有很多坑,大家别再尝试了。
1)走过的弯路
下面是我遇到的大坑,在网上找的视图切换代码(这整整坑了我两天时间哟)。
// 切换为公寓信息界面
else if (e.getSource() == departmentItem)
{
//infoContainer为一个JPanel面板容器对象
infoContainer.removeAll(); //移除当前容器内所有的子组件
departView = new AdminDepartmentInfoView();
infoContainer.add(departView); //将新的组件加入到当前容器中
infoContainer.validate(); // 验证容器及其子组件,重新设置布局方式(反正就是验证新的东西是否可靠能用)
repaint(); // 重画当前容器(相当于更新当前UI界面)
}
- (1).在WindowBuilder中可以看出只departView中只有一个文本TextField对象,恶搞是FlowLayout流式布局,它是能在父容器中显示的。但是只要departView中包含有多个复杂的组件如多有JTable和JscrollPanel等子组件,或是使用除了FlowLayout流式布局和GroupLayout外的其他布局方法,其均不能在父容器中正常显示。
- (2).使用BorderLayout布局不能在父容器中显示。
2)快速使用JTabbedPane
可视化工具WindowBuilder减小了我们做swing界面的难度,但这里却无法用它来做切换界面,我们最多用它来拖出一个JTabbedPane这个父容器,而其内部的每个选项卡组件(每个选项卡都是一个容器)只有通过代码来实现。因为这个些选项卡不能是原生的容器,它们应该是我们在继承JDK中原生容器的基础之上,在其内部添加有大量子组件的自定义容器。
StuInitView stuInitView=new StuInitView();
//给菜单项添加监听器
changeLoginItem=stuInitView.getChangeLoginItem();
exitSysItem=stuInitView.getExitSysItem();
changeLoginItem.addActionListener(this);
exitSysItem.addActionListener(this);
/**
各选项卡项添加
*/
// 添加主页界面
tab.addTab("主页", null,stuInitView, null);
// 添加学生信息面板
tab.addTab("修改&查看本人信息", null, new StuSelfInfoView(stuNo), null);
// 添加水电信息面板
tab.addTab("水电缴费", null, new StuPowerView(stuNo), null);
- 选项卡之一(继承JPanel的自定义容器)
- 选项卡整体效果