swing的JSplitPane容器
Swing中的特殊容器:JSplitPane、JTabbedPane Swing提供了一些具有特殊功能的容器,这些特殊容器可以用于创建一些更复杂的用户界面
JSplitPane JSplitPane用于创建一个分割面板,它可以将一个组件(通常是容器)分割成两个部分(上下两部分或者是左右两部分),并提供一个分割条,用户可以拖动该分割条来调整两个部分大小
JSplitPane使用步骤:
第一步:创建JSplitPane对象,第一步完成后,就有了一个初步的分割面板
JSplitPane(int newOrientation,Component newLeftComponent,Component newRightComponent)
分析一下上面那行的构造方法的各个参数:
1、newOrientation:指定JSplitPane容器的分割方向(纵向分割或者横向分割) 如果值为JSplitPane.VERTICAL_SPLIT,为纵向分割 如果值为JSplitPane.HORIZONTAL_SPLIT,为纵向分割
2、newLeftComponent:左侧或者上侧的组件(即指定分割后的组件,如果是左右分割就指定的是左侧组件,如果是上下分割就指定的是上侧组件)
3、newRightComponent:右侧或者下侧的组件(即指定分割后的组件,如果是左右分割就指定的是右侧组件,如果是上下分割就指定的是下侧组件)
第二步:设置是否开启连续布局的支持(可选,即不一定非要写这个步骤)
setContinuousLayout(boolean newContinuousLayout)
默认是关闭的,如果设置为true,则打开连续布局的支持,但由于连续布局支持需要不断的重绘组件,所有效率会低一些
什么是连续布局:当用户拖动分割条时,两个部分的区域里面的画面组件是否会实时重绘,即用户每拖动一次分割条,组件就重绘一次,如果是,就是连续布局
为了提高效率,我们一般是不支持连续布局的,连续布局的优点就是会提高用户的体验度
第三步:设置是否支持"一触即展"的支持(可选,即不一定非要写这个步骤)
xxxxxxxxxx
setOneTouchExpandable(boolean newValue)
默认是关闭的,如果设置为true,则打开“一触即展”的支持
什么是一触即展:以上下部分的结构为例,上下部分的中间有一条分割条,当用户把这条线拖到比如最底部时,下部分就会消失,只剩下上部分可见 这个一触即展除了用户分割条可以达到效果,在线的最左边有两个按钮,点击即可发生一键展开上部分,或一键展开下部分
第四步:其他设置
方法 | 作用 |
---|---|
setDividerLocation(double proportionalLocation) | 设置分割条的位置为JSplitPane的某个百分比 |
setDividerLocation(int location) | 通过像素值设置分割条的位置 |
setDividerSize(int newSize) | 通过像素值设置分割条的大小 |
setLeftComponent(Component comp) | 设置指定位置的组件 |
swing的JSplitPane容器_练习
xxxxxxxxxx
package ch30;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
public class a_14_0swing_特殊容器_JSplitPane {
//声明好三本书
Book[] books = {
new Book("java入门到精通", new ImageIcon("src\\img\\book1.png"), "国内关于 Java 编程最全面的图书 \n 看得懂 , 学得会"),
new Book("轻量级的JAVA核心技术", new ImageIcon("src\\img\\book2.png"), "SSM整合开发的经典图书,值的拥有"),
new Book("轻松学java编程", new ImageIcon("src\\img\\book3.png"), "全面介绍Android平台应用程序\n 开发的各方面知识")
};
JFrame jf = new JFrame("测试JSplitPane");
//窗口右边区域的列表,JList就是这个列表,里面存放了很多条目包括书名、书描述、书图标。
//由于我们在最下面的Book类里面重写了书名的toString方法,所以这个条目列表只显示的是书名
JList<Book> bookJList = new JList<>(books);//这个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() {
public void valueChanged(ListSelectionEvent e) {
//获取当前选中的是哪个条目,即点击了哪个书名
Book book = bookJList.getSelectedValue();
//把书的图片用bookCover展示,即把书的图片放到左上边区域
bookCover.setIcon(book.getIcon());
//把书的描述用bookDesc展示,即把书的描述放到左下边区域
bookDesc.setText(book.getDesc());
}
});
//组装左边区域的上下两个部分(即图片和描述)。JSplitPane的参数:排列方向(比如这里的两个部分是垂直分割)、上部分组件、下部分组件
JSplitPane left = new JSplitPane(JSplitPane.VERTICAL_SPLIT,bookCover,new JScrollPane(bookDesc));
//上面那行把bookDesc放到new JScrollPane()里面,bookDesc文本域就会有滚动条啦
//一触即展
left.setOneTouchExpandable(true);
//组装整体,即左边区域和右边区域。JSplitPane参数:排列方向(比如这两个区域是水平分割)、左边区域(即125行组装好的左边区域)、右边区域
JSplitPane hole = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,left,bookJList);
//支持连续布局
hole.setContinuousLayout(true);
hole.setDividerSize(10);
jf.add(hole);//不写参数,就是默认将组装好的整体放到jf窗口的中间区域
//设置窗口的最佳大小,设置窗口可见,设置点击叉号就退出程序
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new a_14_0swing_特殊容器_JSplitPane().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;
}
//书的toString方法,作用是让窗口右边区域的列表显示的是书的名称
public String toString() {
return name;
}
}