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 的選項卡的標題;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章