目录
3 Swing中的特殊容器
Swing提供了一些具有特殊功能的容器,这些特殊容器可以用于创建一些更复杂的用户界面。
3.1 使用JSplitPane
JSplitPane用于创建一个分割面板,它可以将一个组件(通常是容器)分割成两个部分,并提供一个分割条,用户可以拖动该分割条来调整两个部分大小。
JSplitPane使用步骤:
1.创建JSplitPane对象
通过如下构造方法可以创建JSplitPane对象
JSplitPane(int newOrientation,Component newLeftComponent,Component newRightComponent)
newOrientation:指定JSplitPane容器的分割方向;
如果值为JSplitPane.VERTICAL_SPLIT,为纵向分割;
如果值为JSplitPane.HORIZONTAL_SPLIT,为纵向分割;
newLeftComponent:左侧或者上侧的组件;
newRightComponent:右侧或者下侧的组件;
2.设置是否开启连续布局的支持(可选)
setContinuousLayout(boolean newContinuousLayout);
默认是关闭的,如果设置为true,则打开连续布局的支持,但由于连续布局支持需要不断的重绘组件,所有效率会低一些
3.设置是否支持“一触即展”的支持(可选)
setOneTouchExpandable(boolean newValue);
默认是关闭的,如果设置为true,则打开“一触即展”的支持
4.其他设置
setDividerLocation(double proportionalLocation);设置分割条的位置为JSplitPane的某个百分比
setDividerLocation(int location);通过像素值设置分割条的位置
setDividerSize(int newSize);通过像素值设置分割条的大小
setLeftComponent(Component comp);设置指定位置的组件
案例:
使用JSplitPane实现下图效果:
点击右侧的图书名称,在左上方显示该图书的图片,左下方显示该图书的描述
public class SplitPaneTest {
Book[] books = {new Book("java自学宝典", new ImageIcon("E:\\GUISwing\\img\\container\\java.png"), "国内关于 Java 编程最全面的图书 \n 看得懂 , 学得会"),
new Book("轻量级的JAVAEE企业应用实战", new ImageIcon("E:\\GUISwing\\img\\container\\ee.png"), "SSM整合开发的经典图书,值的拥有"),
new Book("Android基础教程", new ImageIcon("E:\\GUISwing\\img\\container\\android.png"), "全面介绍Android平台应用程序\n 开发的各方面知识")
};
JFrame jf = new JFrame("测试JSplitPane");
//声明程序中用到的组件
JList<Book> bookJList = new JList<>(books);
JLabel bookCover = new JLabel();
JTextArea bookDesc = new JTextArea();
public void init(){
//组装视图
//设定组件大小
bookJList.setPreferredSize(new Dimension(150,400));
bookCover.setPreferredSize(new Dimension(220,270));
bookDesc.setPreferredSize(new Dimension(220,130));
//为jList设置条目选中监听器
bookJList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
//获取当前选中的是哪个条目
Book book = bookJList.getSelectedValue();
//把书籍的图片用bookCover展示
bookCover.setIcon(book.getIcon());
//把书籍的描述用bookDesc展示
bookDesc.setText(book.getDesc());
}
});
//组装左边区域
JSplitPane left = new JSplitPane(JSplitPane.VERTICAL_SPLIT,bookCover,new JScrollPane(bookDesc));
left.setOneTouchExpandable(true);//一触即展
//组装整体
JSplitPane hole = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,left,bookJList);
//支持连续布局
hole.setContinuousLayout(true);
hole.setDividerSize(10);
jf.add(hole);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.pack();
jf.setVisible(true);
}
public static void main(String[] args) {
new SplitPaneTest().init();
}
}
class Book {
private String name;
private Icon icon;
private String desc;
public Book(String name, Icon icon, String desc) {
this.name = name;
this.icon = icon;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Icon getIcon() {
return icon;
}
public void setIcon(Icon icon) {
this.icon = icon;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return name;
}
}
3.2 使用JTabbedPane
JTabbedPane可以很方便地在窗口上放置多个标签页,每个标签页相当于获得了一个与外部容器具有相同大小的组件摆放区域。通过这种方式,就可以在一个容器里放置更多组件,例如右击桌面上的“我的电脑”图标,在弹出的快捷菜单里单击“属性”菜单工页,就可以看到一个“系统属性”对话框,这个对话框里包含了若干个标签页。
如果需要使用JTabbedPane对象在窗口创建标签页,则可以按如下步骤进行:
1.创建JTabbedPane对象
JTabbedPane(int tabplacement,int tabLayoutPolicy);
tabPlacement:指定标签标题的放置位置,可以选择SwingConstants中的四个常量:TOP、LEFT、BOTTOM、RIGHT
tabLayoutPolicy:指定当窗口不能容纳标签页标题时的布局策略,可以选择JTabbedPane.WRAP_TAB_LAYOUT和JTabbedPane.SCROLL_TAB_LAYOUT
2.通过JTabbedPane对象堆标签进行增删改查
addTab(String title,Icon icon,Component component,String tip);添加标签
title:标签的名称
icon:标签的图标
component:标签对应的组件
tip:光标放在标签上的提示
insertTab(String title,Icon icon,Component component,String tip,int Index);插入标签页
title:标签的名称
icon:标签的图标
component:标签对应的组件
tip:光标放在标签上的提示
index:在哪个索引处插入标签页
setComponentAt(int index,Component component);修改标签页对应的组件
index:修改哪个索引处的标签
component:标签对应的组件
removeTabAt(int index);
index:删除哪个索引处的标签
5.为JTabbedPane设置监听器
addChangeListener(ChangeListener l)
案例:
使用JTabbedPane完成下图功能:
public class JTabbedPaneTest {
JFrame jf = new JFrame("测试JTabbedPane");
JTabbedPane tabbedPane = new JTabbedPane(SwingConstants.LEFT,JTabbedPane.SCROLL_TAB_LAYOUT);
public void init(){
//组装视图
//添加标签
tabbedPane.addTab("用户管理",new ImageIcon("swing\\img\\container\\open.gif"),new JList<String>(new String[]{"用户一","用户二","用户三"}));
tabbedPane.addTab("商品管理",new JList<String>(new String[]{"商品一","商品二","商品三"}));
tabbedPane.addTab("订单管理",new ImageIcon("swing\\img\\container\\open.gif"),new JList<String>(new String[]{"订单一","订单二","订单三","订单四"}));
//完成设置
tabbedPane.setEnabledAt(0,false);//禁用用户管理
tabbedPane.setSelectedIndex(1);//默认商品管理
//监听当前标签面板的选中情况
tabbedPane.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int selectedIndex = tabbedPane.getSelectedIndex();
JOptionPane.showMessageDialog(jf,"当前选中了第 "+(selectedIndex+1)+"个标签");
}
});
jf.add(tabbedPane);
//设置窗口的位置和大小
jf.setBounds(400,400,400,400);
//固定窗口大小
jf.setResizable(false);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
public static void main(String[] args) {
new JTabbedPaneTest().init();
}
}