目录
- Swing 组件面板
- 1. 分割面板
- a. 应用:分割面板
- b. 应用:设置分割面板的属性
- 2. 选项卡面板
- a. 应用:选项卡面板
Swing 组件面板
- 常见的 Swing 组件面板包括分割面板(SplitPane)与选项卡面板(JTabbedPane);
1. 分割面板
- SplitPane(分割面版)一次可将两个组件同时显示在两个显示区中,如果要同时在多个显示区显示组件,就必须同时使用多个 SplitPane。JSplitPane 可以设置面板是水平分割还是垂直分割,这需要设置两个常量:HORIZONTAL_SPLIT、VERTICAL_SPLIT。除了这两个重要的常数外,JSplitPane 还提供了许多常量来支撑其功能;
- javax.swing.JSplitPane,详见:Class JSplitPane;
a. 应用:分割面板
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Test {
public Test() {
JFrame f = new JFrame("Regino");
Container contentPane = f.getContentPane();
JLabel label1 = new JLabel("Label 1", JLabel.CENTER);
label1.setBackground(Color.green);
label1.setOpaque(true);//setOpaque(ture)方法的目的是让组件变成不透明,这样我们在JLabel上所设置的颜色显示出来。
JLabel label2 = new JLabel("Label 2", JLabel.CENTER);
label2.setBackground(Color.pink);
label2.setOpaque(true);
JLabel label3 = new JLabel("Label 3", JLabel.CENTER);
label3.setBackground(Color.yellow);
label3.setOpaque(true);
/*加入label1,label2到splitPane1中,并设置此splitPane1为水平分割且具有Continuous Layout的
*功能。
*/
JSplitPane splitPane1 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, false, label1, label2);
/*设置splitPane1的分隔线位置,0.3是相对于splitPane1的大小而定,因此这个值的范围在0.0~1.0
*中。若你使用整数值来设置splitPane的分隔线位置,如第34行所示,则所定义的值以pixel为计算单位
*/
splitPane1.setDividerLocation(0.3);
splitPane1.setResizeWeight(0.3);
/*设置JSplitPane是否可以展开或收起(如同文件总管一般),设为true表示打开此功能。
*/
splitPane1.setOneTouchExpandable(true);
splitPane1.setDividerSize(10);//设置分隔线宽度的大小,以pixel为计算单位。
JSplitPane splitPane2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false, splitPane1, label3);
splitPane2.setDividerLocation(35);
//设置JSplitPane是否可以展开或收起(如同文件总管一般),设为true表示打开此功能.
splitPane2.setOneTouchExpandable(false);
splitPane2.setDividerSize(5);
contentPane.add(splitPane2);
f.setSize(250, 200);
f.show();
f.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
}
public static void main(String[] args) {
new Test();
}
}
- 效果图:
b. 应用:设置分割面板的属性
import javax.swing.*;
import java.awt.*;
public class Test extends JFrame {
public static void main(String args[]) {
Test frame = new Test();
frame.setVisible(true);
}
public Test() {
super();
setTitle("Regino");
setBounds(100, 100, 500, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个水平方向的分割面板
final JSplitPane hSplitPane = new JSplitPane();
// 分隔条左侧的宽度为40像素
hSplitPane.setDividerLocation(40);
// 添加到指定区域
getContentPane().add(hSplitPane, BorderLayout.CENTER);
// 在水平面板左侧添加一个标签组件
hSplitPane.setLeftComponent(new JLabel(" 1"));
// 创建一个垂直方向的分割面板
final JSplitPane vSplitPane = new JSplitPane(
JSplitPane.VERTICAL_SPLIT);
// 分隔条上方的高度为30像素
vSplitPane.setDividerLocation(30);
vSplitPane.setDividerSize(8);// 分隔条的宽度为8像素
vSplitPane.setOneTouchExpandable(true);// 提供UI小部件
// 在调整分隔条位置时面板的重绘方式为连续绘制
vSplitPane.setContinuousLayout(true);
hSplitPane.setRightComponent(vSplitPane);// 添加到水平面板的右侧
// 在垂直面板上方添加一个标签组件
vSplitPane.setLeftComponent(new JLabel(" 2"));
// 在垂直面板下方添加一个标签组件
vSplitPane.setRightComponent(new JLabel(" 3"));
}
}
- 效果图:
2. 选项卡面板
- 选项卡面板由 JTabbedPane 类实现。它实现了一个包含多个选项卡的用户界面,通过它可以将一个复杂的对话框分割成若干个选项卡,实现对信息的分类显示和管理,使界面更加简洁、美观,还可以减少窗体数量;
- javax.swing.JTabbedPane,详见:Class JTabbedPane;
a. 应用:选项卡面板
- 定义一个 JTabbedPaneTest 类,在该类中添加一个 JTabbedPane 类对象,为该类对象添加 6 个选项卡,单击任何一个选项卡,在窗口下方的 JTextField 中显示出相应的选项卡的标题:
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
class JTabbedPaneTest extends JFrame {
private JTabbedPane jtabbedpane = new JTabbedPane();
private JTextField jtextField = new JTextField();
public JTabbedPaneTest(String title) {
super(title);
Container contentPane = this.getContentPane();
//添加六个选项卡
jtabbedpane.addTab("第一页", new JPanel());
jtabbedpane.addTab("第二页", new JPanel());
jtabbedpane.addTab("第三页", new JPanel());
jtabbedpane.addTab("第四页", new JPanel());
jtabbedpane.addTab("第五页", new JPanel());
jtabbedpane.addTab("第六页", new JPanel());
//注册监听器
jtabbedpane.addChangeListener(new MyChangeListener());
contentPane.add(jtextField, BorderLayout.SOUTH);
contentPane.add(jtabbedpane, BorderLayout.CENTER);
this.setSize(300, 200);
this.setVisible(true);
}
//命名内部类处理Change事件
private class MyChangeListener implements ChangeListener {
public void stateChanged(ChangeEvent e) {
String temp = jtabbedpane.getTitleAt(jtabbedpane.getSelectedIndex());
jtextField.setText(temp + "被选择");
}
}
}
public class Test {
public static void main(String[] args) {
new JTabbedPaneTest("Regino");
}
}
- 效果图:
- 可以将创建 JTabbedPane 类对象的无参构造方法修改为
private JTabbedPane jtabbedpane = new JTabbedPane(JTabbedPane.BOTTOM, JTabbedPane.SCROLL_TAB_LAYOUT);
,以达到以下效果:
- 事件处理中有如下一段代码:
String temp = jtabbedpane.getTitleAt(jtabbedpane.getSelectedIndex());
,其中getSelectedIndex()
方法表示获得当前选择的选项卡的索引值(int 类型,从 0 开始,-1 表示未选中任何选项卡),getTitleAt(index)
方法表示获得索引值为 index 的选项卡的标题;