Java Swing 组件面板


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();
    }
}
  • 效果图:
    11

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"));
    }
}
  • 效果图:
    12

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");
    }
}
  • 效果图:
    21
  • 可以将创建 JTabbedPane 类对象的无参构造方法修改为 private JTabbedPane jtabbedpane = new JTabbedPane(JTabbedPane.BOTTOM, JTabbedPane.SCROLL_TAB_LAYOUT);,以达到以下效果:
    22
  • 事件处理中有如下一段代码:String temp = jtabbedpane.getTitleAt(jtabbedpane.getSelectedIndex());,其中 getSelectedIndex() 方法表示获得当前选择的选项卡的索引值(int 类型,从 0 开始,-1 表示未选中任何选项卡),getTitleAt(index) 方法表示获得索引值为 index 的选项卡的标题;
发布了269 篇原创文章 · 获赞 270 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Regino/article/details/104909158