Microsoft Word - CH14

Similar documents
Chapter 9: Objects and Classes

PowerPoint 簡報

基于CDIO一体化理念的课程教学大纲设计

Swing-02.pdf

(京)新登字063号

Chapter 9: Objects and Classes

coverage2.ppt

<img>

优迈科技教学大纲2009版本

ACI pdf

輕鬆學 Dreamweaver CS5 網頁設計..\Example\Ch0\ \.html..\example\ch0\ \mouse.txt..\example\ch0\ \ _Ok.html 學習重點 JavaScript 複製程式碼 mouse.txt Ctrl+C Ctrl+C 0-4

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

<4D F736F F F696E74202D20B5DA37D5C2204A617661B5C4CDBCD0CED3EBD3C3BBA7BDE7C3E62E BBCE6C8DDC4A3CABD5D>

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

untitled

運算子多載 Operator Overloading

上海市本科教学质量年度报告

<4D F736F F F696E74202D C DB5DA3132D5C25FCDBCD0CED3C3BBA7BDE7C3E6BBF9B4A12E BBCE6C8DDC4A3CABD5D>

week06.key

SW cdr

電機工程系認可證照清單 /7/1


The golden pins of the PCI card can be oxidized after months or years

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

EJB-Programming-4-cn.doc

D C 93 2

(Microsoft Word - \272\364\263q\245|\244A_ _\304\254\253\330\336\263__\272\353\302\262\263\370\247i.doc)

840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00

基于ECO的UML模型驱动的数据库应用开发1.doc

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

18_GUI

1.5招募说明书(草案)

Dynamic Layout in Android

1. 2. Flex Adobe 3.

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

Chapter 9: Objects and Classes

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

热设计网

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

圖 1. 手 工 搭 棚 [ 與 PCB 印 刷 電 路 板 PCB 除 了 電 路 之 外, 也 放 置 各 種 電 子 零 件 如 圖 2 所 示, 電 子 零 件 與 PCB 的 接 合 方 式 有 二 : 插 件 式 (Pin Through Hole, PT

untitled

書面

投影片 1

附录J:Eclipse教程

Microsoft Word - ACI chapter00-1ed.docx

利用Java技术编写桌面软件基础

建立Android新專案

javaexample-02.pdf

Chapter V.S. PC

(CIP) Web /,. :, ISBN X.W T P393.4 CIP (2004) Web ( ) ( / ) : * 787

java2d-4.PDF

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

untitled

上海浦~1

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

大漠 伪前端, 就职于淘宝

Java 1 Java String Date

(Bluesky_MO) Redacted_.indb

Microsoft PowerPoint 龍華科技大學遊戲系-Unity teaching

Microsoft PowerPoint ppt

EJB-Programming-3.PDF

Strings

The Embedded computing platform

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

Learning Java

RUN_PC連載_10_.doc

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>


contents 1 4 Chapter 2 Chapter 5 Chapter 管理自動儲存的版本 以文件復原窗格復原檔案 自訂快速工具 自訂快速存取工具列 自訂功能區

土壤力學概論及第一章

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

mvc

bootstrap - 2

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

ebook

Chemcad.doc


第 一 节 认 识 自 我 的 意 义 一 个 人 只 有 认 识 自 我, 才 能 够 正 确 地 认 识 到 自 己 的 优 劣 势, 找 出 自 己 的 职 业 亮 点, 为 自 己 的 顺 利 求 职 推 波 助 澜 ; 一 个 人 只 有 认 识 自 我, 才 能 在 求 职 中 保 持


目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

Android Android Android SDK iv

滙豐強積金僱主熱線 滙豐強積金網頁 L-MPF001B v07/1016 (1016) H

c_cpp

untitled

epub 66-4

内 容 提 要 将 JAVA 开 发 环 境 迁 移 到 Linux 系 统 上 是 现 在 很 多 公 司 的 现 实 想 法, 而 在 Linux 上 配 置 JAVA 开 发 环 境 是 步 入 Linux 下 JAVA 程 序 开 发 的 第 一 步, 本 文 图 文 并 茂 地 全 程 指

[Short Essay:] 1. (5 points) Use state-of-memory diagram to describe the differences between x and y declared as follows: double[] x = new double[4];

2 Java 语 言 程 序 设 计 教 程 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

投影片 1

p.2 1 <HTML> 2 3 <HEAD> 4 <TITLE> </TITLE> 5 </HEAD> 6 7 <BODY> 8 <H3><B> </B></H3> 9 <H4><I> </I></H4> 10 </BODY> </HTML> 1. HTML 1. 2.

- March 纬 34.8 度 度 );1679 年 9 月 2 日 河 北 三 河 ( 北 纬 40 度, 东 经 度 )- 平 谷 ( 北 纬 40.2 度, 东 经 度 ) 间 8 级 地 震 ( 震 中 不 详 ), 波 及 北 京 的 烈 度 达 历

表二 105 年國中教育會考英語科閱讀與聽力答對題數對應整體能力等級加標示對照表 閱讀答 對題數 聽力答對題數 待加強待加強待加強待加強待加強待加強待加強待加強待加強待加強待加強待加強

10-2 SCJP SCJD 10.1 昇陽認證 Java 系統開發工程師 的認證程序 Java IT SCJD

Text 文字输入功能 , 使用者可自行定义文字 高度, 旋转角度 , 行距 , 字间距离 和 倾斜角度。

運算子多載 Operator Overloading

健保資訊網服務系統 (VPN)- 瀏覽器設定 目 次 壹 作業目的及功能... 2 一 作業目的... 2 二 作業功能... 2 貳 瀏覽器設定說明... 3 一 Internet Explorer 8(IE 8)... 5 二 Internet Explorer 9(IE 9)... 8 三 I

《面向对象程序设计A》课程教学大纲Ⅱ4

Transcription:

Layout Manager 14-1 Layout Manager 之介紹 14-2 Overlay Layout 14-3 Box Layout 14-4 Spring Layout 14-5 Group Layout

本章將介紹如何以 Java Swing 之 Layout Manager 配置物件, 並介紹 Java SE 6.0 新 增之 Group Layout 14-1 Layout Manager 之介紹 在 Java AWT 中, 包括以下之 Layout Manager 類別 : java.awt.flowlayout java.awt.borderlayout java.awt.cardlayout java.awt.gridlayout java.awt.gridbaglayout 除了上述 Java AWT 之 Layout Manager 之外,Java Swing 提供以下之 Layout Manager 類別, 其中 SpringLayout 類別為 JDK 1.4 新增之 Layout Manager,GroupLayout 類別為 JDK 6.0 新增之 Layout Manager: javax.swing.boxlayout javax.swing.overlaylayout javax.swing.springlayout javax.swing.grouplayout 上述 Layout Manager 之類別皆實作 java.awt.layoutmanager 介面, 請參考 3-1 節之說明 此外, 亦實作 java.awt.layoutmanager2 介面, 增加配置物件之限制 (Constraint), 此限制代表 Layout Manager 配置物件的方式 有關如何在 Java Swing 中使用 FlowLayout BorderLayout CardLayout GridLayout 及 GridBagLayout 等 Layout Manager, 請分別參考 3-2 至 3-6 節之說明 需注意的是, 在 JDK 1.4( 含 ) 之前, 欲在 JFrame 與 JApplet 等容器配置物件, 需先以 getcontentpane() 方法取得其 Content Pane, 此方法回傳 java.awt.container 物件, 代表 JFrame 與 JApplet 等之 Content Pane, 接著以 setlayout() 方法針對此 Content Pane 設定其 Layout Manager, 而非 JFrame 與 JApplet, 例如 : 14-2

// JDK 1.4 的用法 // 取得其 Content Pane Container contentpane = getcontentpane(); // 定義 Layout Manager 為 FlowLayout contentpane.setlayout(new FlowLayout()); JButton jbutton = new JButton("OK"); // 將物件加至 Content Pane 中 contentpane.add(jbutton); 請參考範例 14-1 與 14-2 由於上述方法較為麻煩, 因此 Java 於 JDK 5.0( 含 ) 之後, 將上述方法修改如同 Java AWT 一般, 可直接針對 JFrame 與 JApplet 等容器以 setlayout() 方法設定其 Layout Manager, 因此除了可使用 Content Pane 之外, 亦可直接對容器設定其 Layout Manager, 例如 : // 直接定義 JFrame 之 Layout Manager 為 FlowLayout this.setlayout(new FlowLayout()); JButton jbutton = new JButton("OK"); // 直接將物件加至 JFrame 中 this.add(jbutton); 請參考範例 14-3 與 14-12 Flow Layout 14-3

Border Layout Card Layout Grid Layout Grid Bag Layout 14-4

除了 Java AWT 的 Layout Manager 之外, 本章將依序介紹以下 Java Swing 之 Layout Manager: javax.swing.overlaylayout javax.swing.boxlayout javax.swing.springlayout javax.swing.grouplayout 14-2 Overlay Layout Overlay Layout 其類別為 javax.swing.overlaylayout, 如同其名稱 Overlay( 覆蓋 ) 一般, 以重疊方式配置物件, 並且以對齊點 (Alignment Point) 設定物件的對齊位置, 物件以 JComponent 抽象類別的 setalignmentx() 與 setalignmenty() 方法設定水平與垂直對齊方式 : public void setalignmentx(float alignmentx) 設定物件水平方向的對齊方式, 其中參數 alignmentx 為水平對齊係數, 由 0.0f 至 1.0f,0.0f 代表向左對齊 0.5f 代表向中央對齊 1.0f 代表向右對齊, 如同以下之常數值 : Component.LEFT_ALIGNMENT: 向左對齊 Component.CENTER_ALIGNMENT: 向中央對齊 Component.RIGHT_ALIGNMENT: 向右對齊 public void setalignmenty(float alignmenty) 設定物件垂直方向的對齊方式, 其中參數 alignmenty 為垂直對齊係數, 由 0.0f 至 1.0f,0.0f 代表向上對齊 0.5f 代表向中央對齊 1.0f 代表向下對齊, 如同以下之常數值 : Component.TOP_ALIGNMENT: 向上對齊 Component.CENTER_ALIGNMENT: 向中央對齊 Component.BOTTOM_ALIGNMENT: 向下對齊 14-5

其中對齊係數為 0.0f 至 1.0f 間之值, 例如設定水平的對齊係數為 0.5f 時, 代表物件位於容器的水平中央 除了設定水平與垂直的對齊方式之外, 使用 Overlay Layout 時, 另需定義物件之最小 最佳及最大尺寸, 以作為容器大小調整時, 物件調整之依據 OverlayLayout 類別的建構函式如下, 其中參數 target 用以指定配置 Overlay Layout 之容器 : public OverlayLayout(Container target) OverlayLayout 類別的方法有 : public void addlayoutcomponent(component comp, Object constraints) 加入物件至 Layout Manager 中, 其中參數 comp 為 Component 型別, 代表加入 之物件, 參數 constraints 為配置物件之限制 public void addlayoutcomponent(string name, Component comp) 加入物件至 Layout Manager 中, 其中參數 comp 為 Component 型別, 因此加入物件代表加入繼承 Component 抽象類別之物件, 可為 Java AWT 或 Java Swing 類別 public float getlayoutalignmentx(container target) 取得置放物件之容器其水平方向的對齊方式, 並回傳 0.0f 到 1.0f 之值,0.0f 代表向左對齊 0.5f 代表向中央對齊 1.0f 代表向右對齊 public float getlayoutalignmenty(container target) 取得置放物件之容器其垂直方向的對齊方式, 並回傳 0.0f 到 1.0f 之值,0.0f 代表向上對齊 0.5f 代表向中央對齊 1.0f 代表向下對齊 public final Container gettarget() (JDK 6.0) 取得配置之容器 14-6

public void invalidatelayout(container target) 使置放物件之容器無效 public void layoutcontainer(container target) 配置指定之容器 public Dimension maximumlayoutsize(container target) 取得置放物件容器之最大尺寸, 其中參數 target 為 java.awt.container 型別, 並回傳 java.awt.dimension 型別, 其 Dimension.height 與 Dimension.width 分別代表此容器之最大高度與寬度 public Dimension minimumlayoutsize(container target) 取得置放物件容器之最小尺寸, 其中參數 target 為 java.awt.container 型別, 並回傳 java.awt.dimension 型別, 其 Dimension.height 與 Dimension.width 分別代表此容器之最小高度與寬度 public Dimension preferredlayoutsize(container target) 取得置放物件容器之最佳尺寸, 其中參數 target 為 java.awt.container 型別, 並回傳 java.awt.dimension 型別, 其 Dimension.height 與 Dimension.width 分別代表此容器之最佳高度與寬度 public void removelayoutcomponent(component comp) 自 Layout Manager 移除物件 請參考範例 14-13 14-7

14-3 Box Layout Box Layout 為 Java Swing 之 Layout Manager, 其類別為 javax.swing.boxlayout, 類似於 Java AWT 的 Flow Layout Flow Layout 允許物件預設由左至右依序配置於容器中, 當物件在容器中超過一列之配置時, 會依序由上而下自下一列繼續配置物件 而 Box Layout 則是可選擇由左至右或由上而下配置物件 此外, 與 Flow Layout 最大的不同是, 當 Box Layout 由左至右配置物件時, 會嘗試調整物件的寬度為其最佳寬度 (Preferred Width), 當容器的寬度不足時,Box Layout 會自動調整物件的寬度以儘量符合容器的寬度限制, 另外 Box Layout 以其中高度最大的物件之最佳高度 (Preferred Height) 為基準, 調整各物件的高度使其一致, 但若物件設定其最大高度超過容器之高度限制時, 則會依 JComponent 抽象類別的 setalignmenty() 方法調整容器中各物件垂直方向的對齊方式, 其宣告方式為 : public void setalignmenty(float alignmenty) 設定物件垂直方向的對齊方式, 其中參數 alignmenty 為垂直對齊係數, 由 0.0f 至 1.0f,0.0f 代表向上對齊 0.5f 代表向中央對齊 1.0f 代表向下對齊, 如同以下之常數值 : Component.TOP_ALIGNMENT: 向上對齊 Component.CENTER_ALIGNMENT: 向中央對齊 Component.BOTTOM_ALIGNMENT: 向下對齊 如下圖所示, 各物件依中央對齊 : 同樣當 Box Layout 由上而下配置物件時, 會嘗試調整物件的高度為其最佳高度 (Preferred Height), 當容器的高度不足時,Box Layout 會自動調整物件的高度以 儘量符合容器的高度限制, 另外 Box Layout 以其中寬度最大的物件之最佳寬度 14-8

(Preferred Width) 為基準, 調整各物件的寬度使其一致, 但若物件設定其最大寬 度超過容器之寬度限制時, 則會依 JComponent 抽象類別的 setalignmentx() 方法調 整容器中各物件水平方向的對齊方式, 其宣告方式為 : public void setalignmentx(float alignmentx) 設定物件水平方向的對齊方式, 其中參數 alignmentx 為水平對齊係數, 由 0.0f 至 1.0f,0.0f 代表向左對齊 0.5f 代表向中央對齊 1.0f 代表向右對齊, 如同以下之常數值 : Component.LEFT_ALIGNMENT: 向左對齊 Component.CENTER_ALIGNMENT: 向中央對齊 Component.RIGHT_ALIGNMENT: 向右對齊 如下圖所示, 各物件依中央對齊 : BoxLayout 類別之建構函式為 : public BoxLayout(Container target, int axis) 其中參數 : 1. target: 指定配置 Box Layout 之容器 2. axis: 設定容器配置物件的方式, 為以下之常數值 : BoxLayout.X_AXIS: 由左至右配置 BoxLayout.Y_AXIS: 由上至下配置 BoxLayout.LINE_AXIS: 依據容器所設定之 ComponentOrientation 配置方向, 設定一行之配置方向, 通常為水平方向的配置方式 14-9

BoxLayout.PAGE_AXIS: 依據容器所設定之 ComponentOrientation 配置方向, 設定整頁之配置方向, 通常為垂直方向的配置方式 其中 java.awt.componentorientation 之配置方向, 可為以下之常數值 : ComponentOrientation.LEFT_TO_RIGHT: 物件由左至右配置 ComponentOrientation.RIGHT_TO_LEFT: 物件由右至左配置 BoxLayout 類別的方法有 : public final int getaxis() (JDK 6.0) 取得容器配置物件的方式, 為以下之常數值 : BoxLayout.X_AXIS: 由左至右配置 BoxLayout.Y_AXIS: 由上至下配置 BoxLayout.LINE_AXIS: 依據容器所設定之 ComponentOrientation 配置方向, 設定一行之配置方向 BoxLayout.PAGE_AXIS: 依據容器所設定之 ComponentOrientation 配置方向, 設定一頁之配置方向 public float getlayoutalignmentx(container target) 取得置放物件之容器其水平方向的對齊方式, 並回傳 0.0f 到 1.0f 之值,0.0f 代表向左對齊 0.5f 代表向中央對齊 1.0f 代表向右對齊, 如同以下之常數值 : Component.LEFT_ALIGNMENT: 向左對齊 Component.CENTER_ALIGNMENT: 向中央對齊 Component.RIGHT_ALIGNMENT: 向右對齊 public float getlayoutalignmenty(container target) 取得置放物件之容器其垂直方向的對齊方式, 並回傳 0.0f 到 1.0f 之值,0.0f 代表向上對齊 0.5f 代表向中央對齊 1.0f 代表向下對齊, 如同以下之常數值 : Component.TOP_ALIGNMENT: 向上對齊 Component.CENTER_ALIGNMENT: 向中央對齊 Component.BOTTOM_ALIGNMENT: 向下對齊 14-10

public final Container gettarget() (JDK 6.0) 取得配置之容器 public void invalidatelayout(container target) 使置放物件之容器無效 public void layoutcontainer(container target) 配置指定之容器 public Dimension maximumlayoutsize(container target) 取得置放物件容器之最大尺寸, 其中參數 target 為 java.awt.container 型別, 並回傳 java.awt.dimension 型別, 其 Dimension.height 與 Dimension.width 分別代表此容器之最大高度與寬度 public Dimension minimumlayoutsize(container target) 取得置放物件容器之最小尺寸, 其中參數 target 為 java.awt.container 型別, 並回傳 java.awt.dimension 型別, 其 Dimension.height 與 Dimension.width 分別代表此容器之最小高度與寬度 public Dimension preferredlayoutsize(container target) 取得置放物件容器之最佳尺寸, 其中參數 target 為 java.awt.container 型別, 並回傳 java.awt.dimension 型別, 其 Dimension.height 與 Dimension.width 分別代表此容器之最佳高度與寬度 public void removelayoutcomponent(component comp) 自 Layout Manager 移除物件 請參考範例 14-14 範例 14-14 介紹如何以 Box Layout 配置物件, 其中可藉由以下之設定, 定義 Box Layout 的配置方向 : 14-11

BoxLayout.X_AXIS: 由左至右配置 BoxLayout.Y_AXIS: 由上至下配置 BoxLayout.LINE_AXIS: 依據容器所設定之 ComponentOrientation 配置方向, 設定一行之配置方向 BoxLayout.PAGE_AXIS: 依據容器所設定之 ComponentOrientation 配置方向, 設定一頁之配置方向 除了 BoxLayout 類別之外, 另可配合 javax.swing.box 類別使用 ( 註 ), 以定義容器 中各物件間之間隔距離,Box 類別分別提供 Glue Rigid Area Strut 及自訂 Filler 四種方式定義間隔距離, 茲分別說明如下 : ( 註 ):javax.swing.box 類別除了可配合 javax.swing.boxlayout 類別使用之外, 亦可與其他 Java Swing 之 Layout Manager 類別一起使用, 以定義物件間之間隔距離 Glue Glue 用以定義容器中各物件間的額外空間 (Excess Space), 以下圖為例, 若兩物件間未設定任何間隔時, 則物件間並無任何間隔, 而其額外空間則為此兩物件的最右方空間, 其寬度為容器之寬度扣除容器中所有物件之總寬度 : 14-12

若兩物件間設定 Glue 時, 會以此額外空間作為物件間之間隔, 如下圖所示 : 由此可知, 此額外空間之大小取決於容器之大小與容器中各物件之大小, 因此為變動大小 此外, 若容器中各物件之大小均相同, 則建議以 Glue 設定其額外空間為物件間之間隔 欲以 Glue 設定其額外空間, 可使用以下 Box 類別之方法定義 : public static Component createglue() 建立 Box 之 Glue 區域, 並回傳 Component 型別, 代表其額外空間 public static Component createhorizontalglue() 建立 Box 水平方向之 Glue 區域, 並回傳 Component 型別, 代表其額外空間 public static Component createverticalglue() 建立 Box 垂直方向之 Glue 區域, 並回傳 Component 型別, 代表其額外空間 請參考範例 14-15 由於容器 (JPanel) 設定其最佳尺寸, 其中寬度為 200, 超過容器內所有物件 (JButton) 寬度的總和, 因此物件間將產生一額外空間以作為物件間之間隔 14-13

Rigid Area 上述 Glue 是在物件間產生一 變動 大小的額外空間, 此區域的大小取決於容器與所置物件的大小 而 Rigid Area 則是在物件間建立一 固定 大小的區域以作為其間隔, 如下圖所示, 由此可知剩餘的空間將位於所有物件的最右方 : 欲以 Rigid Area 設定物件間之間隔, 可使用以下 Box 類別之方法定義 : public static Component createrigidarea(dimension d) 建立 Box 之固定大小 (Rigid Area) 區域, 其中參數 d 為 java.awt.dimension 型別, 其 Dimension.height 與 Dimension.width 分別代表區域之高度與寬度, 並回傳 java.awt.component 型別, 代表此固定大小區域 請參考範例 14-16 讀者可試著改變視窗的寬度與高度, 可發現物件間之間隔為固定大小之區域, 不會因視窗大小改變而改變 Strut Glue 及 Rigid Area 方法均用以建立物件間之間隔區域, 而 Strut 則用以定義水平或垂直方向的 固定 大小區域 14-14

當建立水平方向的 Strut 時, 則產生一固定寬度的空間區域, 由於水平 Strut 有其固 定寬度, 因此可用以限制容器之最小寬度, 如下圖所示 : 反之, 當建立垂直方向的 Strut 時, 則產生一固定高度的空間區域, 由於垂直 Strut 有其固定高度, 因此可用以限制容器之最小高度, 如下圖所示 : 因此 Strut 常運用於限制容器的最小寬度或高度 建立 Strut, 可使用以下 Box 類別之方法定義 : public static Component createhorizontalstrut(int width) 建立 Box 水平方向固定寬度之區域, 其中參數 width 代表區域之寬度, 並回傳 Component 型別, 代表此區域 public static Component createverticalstrut(int height) 建立 Box 垂直方向固定高度之區域, 其中參數 height 代表區域之高度, 並回傳 Component 型別, 代表此區域 請參考範例 14-17 及 14-18, 分別示範如何以 Strut 限制容器的最小寬度與高度 14-15

讀者可試著改變視窗的寬度與高度, 但由於 Strut 會產生一固定寬度或高度的空間區域, 因此將限制容器的最小寬度或高度 自訂 Filler 最後一種也是最彈性的方法, 則是自訂區域的最小 (Minimum) 最佳 ( Preferred) 及最大 (Maximum) 尺寸 當容器大小改變時, 此自訂大小之區域會隨著自訂區域的最小 最佳及最大尺寸而改變, 如下圖所示 : 欲建立自訂大小之 Filler 區域, 需使用 javax.swing.box.filler 類別, 其建構函式 為 : public Box.Filler(Dimension min, Dimension pref, Dimension max) 其中參數 : 1. min: 設定區域之最小尺寸 2. pref: 設定區域之最佳尺寸 3. max: 設定區域之最大尺寸 14-16

Box.Filler 類別的方法有 : public void changeshape(dimension min, Dimension pref, Dimension max) 改變自訂 Filler 區域的大小, 其中參數 min 代表區域之最小尺寸,pref 代表區域之最佳尺寸,max 代表區域之最大尺寸 請參考範例 14-19 14-4 Spring Layout Spring Layout 為 JDK 1.4 新增之 Layout Manager, 其類別為 javax.swing.springlayout Spring Layout 與 Grid Bag Layout 同屬較彈性的 Layout Manager, 需配合其限制 (Constraints) 定義各物件的配置方式, 因此可想而知其程式亦較為複雜 與 Grid Bag Layout 之不同在於,Grid Bag Layout 將容器劃分成數個區域 (Cell), 並透過各物件的水平與垂直加權 (Weight), 以決定物件所佔據的區域數目 而 Spring Layout 則是以定義物件間其水平或垂直邊緣 (Edge) 間之距離, 以此距離及物件的長寬定義各物件的位置 以 Spring Layout 配置物件, 需使用以下三個類別 : 1. javax.swing.spring: 定義物件邊緣間的距離, 可分為最小 最佳 最大或實際距離 14-17

2. javax.swing.springlayout: 定義 Layout Manager 為 Spring Layout 3. javax.swing.springlayout.constraints: 定義 Spring 邊緣間距的限制, 此限制包括 Spring 類別的水平 垂直 寬度及高度等 各物件間之距離是依據其邊緣及距離定義, 茲分別說明如下 14-4-1 Spring 類別 javax.swing.spring 類別用以定義物件邊緣間的距離, 可分為最小 最佳 最大或 實際距離, 其建構函式為 : protected Spring() 其方法有 : public static Spring constant(int pref) 設定 Spring 物件, 此物件代表邊緣間的距離, 其中參數 pref 代表物件邊緣間 之最佳距離 public static Spring constant(int min, int pref, int max) 設定 Spring 物件, 其中參數 min pref max 分別代表物件邊緣間之最小 最 佳 最大距離 public abstract int getmaximumvalue() 取得 Spring 物件的最大值 public abstract int getminimumvalue() 取得 Spring 物件的最小值 public abstract int getpreferredvalue() 取得 Spring 物件的最佳值 14-18

public abstract int getvalue() 取得 Spring 物件之目前值 public abstract void setvalue(int value) 設定 Spring 物件之目前值 public static Spring max(spring s1, Spring s2) 取得兩 Spring 物件的最大值, 並回傳 Spring 型別的物件 public static Spring minus(spring s) 以 Spring 物件的相反方向定義 Spring 物件, 並回傳 Spring 型別的物件 public static Spring sum(spring s1, Spring s2) 以兩 Spring 物件的相加定義 Spring 物件, 並回傳 Spring 型別的物件 14-4-2 SpringLayout 類別 javax.swing.springlayout 類別用以定義容器之 Layout Manager 為 Spring Layout, 並以下列之值定義物件的邊緣, 藉由物件之邊緣間及距離定義各物件間之距離 : SpringLayout.BASELINE: 物件的基準線 SpringLayout.EAST: 物件的右側邊緣 SpringLayout.HEIGHT: 物件的高度 SpringLayout.HORIZONTAL_CENTER: 物件的水平中央 SpringLayout.NORTH: 物件的上方邊緣 SpringLayout.SOUTH: 物件的下方邊緣 SpringLayout.VERTICAL_CENTER: 物件的垂直中央 SpringLayout.WEST: 物件的左側邊緣 SpringLayout.WIDTH: 物件的寬度 14-19

請參考下圖之說明 : 以下之運算範例說明物件邊緣之間的關係 : // 物件右側邊緣 (EAST) = 物件左側邊緣 (WEST) + 物件寬度 SpringLayout.EAST = SpringLayout.WEST + SpringLayout.WIDTH; // 物件下方邊緣 (SOUTH) = 物件上方邊緣 (NORTH) + 物件高度 SpringLayout.SOUTH = SpringLayout.NORTH + SpringLayout.HEIGHT; // 物件水平中央 (HORIZONTAL_CENTER) = 物件左側邊緣 (WEST) + 物件寬度 /2 SpringLayout.HORIZONTAL_CENTER = SpringLayout.WEST + SpringLayout.WIDTH/2; // 物件垂直中央 (VERTICAL_CENTER) = 物件上方邊緣 (NORTH) + 物件高度 /2 SpringLayout.VERTICAL_CENTER = SpringLayout.NORTH + SpringLayout.HEIGHT/2; SpringLayout 類別之建構函式為 : public SpringLayout() 其方法有 : public void addlayoutcomponent(component component, Object constraints) 將物件以指定之邊緣間距限制加入至 Layout Manager 中, 其中參數 component 為 Component 型別, 代表加入之物件, 參數 constraints 為 SpringLayout.Constraints 之邊緣間距限制 14-20

public Spring getconstraint(string edgename, Component c) 取得物件所定義之邊緣間距限制, 並回傳 Spring 型別, 其中參數 edgename 為以下之常數值 : SpringLayout.BASELINE: 物件的基準線 SpringLayout.EAST: 物件的右側邊緣 SpringLayout.HEIGHT: 物件的高度 SpringLayout.HORIZONTAL_CENTER: 物件的水平中央 SpringLayout.NORTH: 物件的上方邊緣 SpringLayout.SOUTH: 物件的下方邊緣 SpringLayout.VERTICAL_CENTER: 物件的垂直中央 SpringLayout.WEST: 物件的左側邊緣 SpringLayout.WIDTH: 物件的寬度 public float getlayoutalignmentx(container p) 取得水平方向的對齊方式, 並回傳 0.5f, 代表向水平中央對齊 public float getlayoutalignmenty(container p) 取得垂直方向的對齊方式, 並回傳 0.5f, 代表向垂直中央對齊 public void invalidatelayout(container target) 使置放物件之容器無效 public void layoutcontainer(container target) 配置指定之容器 public Dimension maximumlayoutsize(container target) 取得置放物件容器之最大尺寸, 其中參數 target 為 java.awt.container 型別, 並回傳 java.awt.dimension 型別, 其 Dimension.height 與 Dimension.width 分別代表此容器之最大高度與寬度 14-21

public Dimension minimumlayoutsize(container target) 取得置放物件容器之最小尺寸, 其中參數 target 為 java.awt.container 型別, 並回傳 java.awt.dimension 型別, 其 Dimension.height 與 Dimension.width 分別代表此容器之最小高度與寬度 public Dimension preferredlayoutsize(container target) 取得置放物件容器之最佳尺寸, 其中參數 target 為 java.awt.container 型別, 並回傳 java.awt.dimension 型別, 其 Dimension.height 與 Dimension.width 分別代表此容器之最佳高度與寬度 public void removelayoutcomponent(component comp) 自 Layout Manager 移除物件 14-4-3 SpringLayout.Constraints 類別 javax.swing.springlayout.constraints 為 javax.swing.springlayout 類別的 Inner 類別, 用以定義 Spring 邊緣間距的限制, 此限制包括 Spring 類別的水平 垂直 寬度及高度等, 其建構函式為 : public SpringLayout.Constraints() public SpringLayout.Constraints(Component c) public SpringLayout.Constraints(Spring x, Spring y) public SpringLayout.Constraints(Spring x, Spring y, Spring width, Spring height) 其中參數 : 1. c:springlayout.constraints 物件 2. x:spring 的水平屬性值 3. y:spring 的垂直屬性值 14-22

4. width:spring 的寬度屬性值 5. height:spring 的高度屬性值 其方法有 : public Spring getconstraint(string edgename) 取得邊緣的限制屬性值 public void setconstraint(string edgename, Spring s) 設定邊緣的限制屬性值, 其中參數 edgename 為以下之常數值 : SpringLayout.BASELINE: 物件的基準線 SpringLayout.EAST: 物件的右側邊緣 SpringLayout.HEIGHT: 物件的高度 SpringLayout.HORIZONTAL_CENTER: 物件的水平中央 SpringLayout.NORTH: 物件的上方邊緣 SpringLayout.SOUTH: 物件的下方邊緣 SpringLayout.VERTICAL_CENTER: 物件的垂直中央 SpringLayout.WEST: 物件的左側邊緣 SpringLayout.WIDTH: 物件的寬度 public Spring getheight() 取得 Spring 的高度屬性值 (height) public void setheight(spring height) 設定 Spring 的高度屬性值 public Spring getwidth() 取得 Spring 的寬度屬性值 (width) public void setwidth(spring width) 設定 Spring 的寬度屬性值 14-23

public Spring getx() 取得 Spring 的水平屬性值 (x) public void setx(spring x) 設定 Spring 的水平屬性值 public Spring gety() 取得 Spring 的垂直屬性值 (y) public void sety(spring y) 設定 Spring 的垂直屬性值 除了上述類別之外, 一般的 Layout Manager 並不需要設定起始物件的位置, 但 Spring Layout 則需要設定, 依據此起始物件的位置可依序定義物件的相對位置 請參考範例 14-20 範例 14-20 介紹如何以 Spring Layout 定義物件間邊緣的距離 首先設定 Button 1 的起始水平與垂直位置各為 10 單位像素 (Pixel), 因此 Button 1 將定位於距離視窗原點 (10, 10) 的位置 : JButton jbutton1 = new JButton("Button 1"); // 設定 Spring 物件, 代表邊緣間的最佳距離 Spring x = Spring.constant(10); Spring y = Spring.constant(10); // 取得物件的限制 SpringLayout.Constraints spconstraints = layout.getconstraints(jbutton1); // 設定 Spring 的水平屬性值 spconstraints.setx(x); // 設定 Spring 的垂直屬性值 spconstraints.sety(y); 14-24

接著以 Spring 類別的 sum() 方法, 依序設定 Button 2 及 Button 3 的位置, 其中 Button 2 的水平座標是以 Button 1 的右側邊緣 (SpringLayout.EAST) 為基準加上 5 單位像素距離, 而其垂直座標則是以 Button 1 的下方邊緣 (SpringLayout.SOUTH) 為基準加上 5 單位像素距離 : JButton jbutton2 = new JButton(new ImageIcon("images/dukeswing.gif")); // 以兩 Spring 物件的相加定義 Spring 物件 x = Spring.sum(Spring.constant(5), spconstraints.getconstraint(springlayout.east)); y = Spring.sum(Spring.constant(5), spconstraints.getconstraint(springlayout.south)); // 取得物件的限制 spconstraints = layout.getconstraints(jbutton2); // 設定 Spring 的水平屬性值 spconstraints.setx(x); // 設定 Spring 的垂直屬性值 spconstraints.sety(y); Button 3 亦然 : JButton jbutton3 = new JButton("Button 3", new ImageIcon("images/dukeswing.gif")); // 以兩 Spring 物件的相加定義 Spring 物件 x = Spring.sum(Spring.constant(5), spconstraints.getconstraint(springlayout.east)); y = Spring.sum(Spring.constant(5), spconstraints.getconstraint(springlayout.south)); // 取得物件的限制 spconstraints = layout.getconstraints(jbutton3); // 設定 Spring 的水平屬性值 spconstraints.setx(x); // 設定 Spring 的垂直屬性值 spconstraints.sety(y); 14-25

請參考下圖之解說 : 由範例 14-20 可瞭解物件之間的距離是如何依據其邊緣而定義, 藉由範例 14-20 的 經驗, 可設計出如下圖之物件配置, 此類配置常運用於資料輸入對話盒, 請參範例 14-21 14-5 Group Layout Group Layout 是 Java SE 6.0 新增之 Layout Manager, 其類別為 javax.swing.grouplayout, 也是筆者認為功能最強大的 Layout Manager Group Layout 原為 Swing Labs Project 為 NetBeans 所開發之 GUI 配置工具, 並正式加入至 NetBeans 5.0 之中, 為配置物件之預設 Layout Manager, 稱為 Free Design, 14-26

由於功能強大, 因此 Sun 將此類別新增至 Java SE 6.0 之中, 作為配置物件之 Layout Manager 14-5-1 NetBeans GUI 配置工具 在使用 Group Layout 配置物件時, 可使用 NetBeans 5.0 之 GUI 配置工具配置 Java AWT 或 Java Swing 物件,NetBeans 5.0 會自動產生程式碼, 待物件配置完畢之後, 則以此程式碼為依據開發視窗應用程式 雖然 NetBeans 5.0 會自動產生程式碼, 但 實際上此程式碼並不能直接由 Java SE 6.0 使用, 其主要原因是 NetBeans 5.0 所使 用的 GroupLayout 類別, 其套件 (Package) 為 org.jdesktop.layout, 而在 Java SE 6.0 中則是 javax.swing, 且最大的差異是加入物件的方法其名稱完全不同, 因此 NetBeans 5.0 所產生的程式碼並不能直接由 Java SE 6.0 使用, 需稍加修改方能引用 在 Sun 推出最新的 Java SE 6.0 之後,NetBeans 5.5 亦正式發表, 上述的問題已被修 正,NetBeans 5.5 搭配 Java SE 6.0, 其預設配置物件的 Layout Manager 設定為 javax.swing.grouplayout 類別, 因此筆者建議讀者使用 NetBeans 5.5 之後的版本 ( 註 ) ( 註 ): 至 2008 年 11 月止, 目前最新的版本為 NetBeans 6.5, 請參考 http://www.netbeans.org 在介紹 Group Layout 之前, 不妨先瞭解 NetBeans 6.5 的 GUI 配置工具如何藉由 javax.swing.grouplayout 類別配置物件 在 NetBeans 6.5 中, 欲設定容器之 Layout Manager 為 Group Layout, 可使用滑鼠 右鍵點選容器, 在突顯式選單中選取 Set Layout Free Design, 容器之 Layout Manager 則設定為 Group Layout, 如下圖所示 ( 請參考範例 14-22): 14-27

待選取 Free Design 之後,NetBeans 會自動產生以下之程式碼, 除了設定容器之 Layout Manager 為 Group Layout 之外, 並自動設定其水平群組 (Horizontal Group) 與垂直群組 (Vertical Group): // 定義 Layout Manager 為 GroupLayout javax.swing.grouplayout layout = new javax.swing.grouplayout(getcontentpane()); // 以 getcontentpane() 方法取得其 Content Pane // 並設定 Content Pane 之 Layout Manager 為 GroupLayout getcontentpane().setlayout(layout); // 設定水平群組 layout.sethorizontalgroup( layout.createparallelgroup( javax.swing.grouplayout.alignment.leading).addgap(0, 300, Short.MAX_VALUE) ); // 設定垂直群組 layout.setverticalgroup( layout.createparallelgroup( javax.swing.grouplayout.alignment.leading).addgap(0, 100, Short.MAX_VALUE) ); 14-28

接著於容器中加入 Java Swing 之標籤, 當拖曳標籤時,NetBeans 會自動產生 相 對基準線 以建議物件的置放位置 : 待確定標籤位置之後,NetBeans 自動產生以下之程式碼, 其中在水平與垂直群組 中, 除加入標籤的程式之外, 並加入平行群組 (Parallel Group) 循序群組 (Sequential Group) 與間隔 (Gap): // 設定水平群組 layout.sethorizontalgroup( // 建立平行群組 layout.createparallelgroup( javax.swing.grouplayout.alignment.leading) // 建立循序群組.addGroup(layout.createSequentialGroup() // 加入容器間隔.addContainerGap() // 加入標籤.addComponent(jLabel1) // 加入容器間隔.addContainerGap(255, Short.MAX_VALUE)) ); // 設定垂直群組 layout.setverticalgroup( // 建立平行群組 layout.createparallelgroup( javax.swing.grouplayout.alignment.leading) // 建立循序群組.addGroup(layout.createSequentialGroup() // 加入容器間隔.addContainerGap() // 加入標籤.addComponent(jLabel1) // 加入容器間隔.addContainerGap(55, Short.MAX_VALUE)) ); 接著依序加入 Java Swing 之標籤與文字欄位, 當拖曳物件至其他物件附近時, NetBeans 會自動產生 相對基準線, 並以物件之基準線 (Baseline) 協助對齊物 件, 如下圖所示 : 14-29

其次, 若希望文字欄位能隨著容器水平方向之大小改變而變更其寬度, 可先點選文字欄位, 接著再點選工具列上之 Change horizontal resizability 按鈕, 則完成文字欄位變更大小之設定 : 此外, 欲設定所有的文字欄位寬度一致, 首先選取所有文字欄位, 再以滑鼠右鍵點選文字欄位, 在突顯式選單中選取 Same Size Same Width, 則所有被選取的文字欄位將為相同之寬度, 如下圖所示 : NetBeans 所產生之程式碼為 : layout.sethorizontalgroup( layout.createparallelgroup( javax.swing.grouplayout.alignment.leading).addgroup(layout.createsequentialgroup() 14-30

);.addcontainergap().addgroup(layout.createparallelgroup( javax.swing.grouplayout.alignment.leading).addcomponent(jlabel1).addcomponent(jlabel2)).addpreferredgap( javax.swing.layoutstyle.componentplacement.related).addgroup(layout.createparallelgroup( javax.swing.grouplayout.alignment.leading).addcomponent(jtextfield1, javax.swing.grouplayout.default_size, 215, Short.MAX_VALUE).addComponent(jTextField2, javax.swing.grouplayout.default_size, 215, Short.MAX_VALUE)).addContainerGap()) layout.setverticalgroup( layout.createparallelgroup( javax.swing.grouplayout.alignment.leading).addgroup(layout.createsequentialgroup().addcontainergap().addgroup(layout.createparallelgroup( javax.swing.grouplayout.alignment.baseline).addcomponent(jlabel1).addcomponent(jtextfield1, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size)).addpreferredgap( javax.swing.layoutstyle.componentplacement.related).addgroup(layout.createparallelgroup( javax.swing.grouplayout.alignment.baseline).addcomponent(jlabel2).addcomponent(jtextfield2, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size)).addcontainergap(javax.swing.grouplayout.default_size, Short.MAX_VALUE)) ); 當完成物件配置之後, 可使用滑鼠右鍵點選容器, 在突顯式選單中選取 Preview Design 並選取 Look and Feel 如 Metal, 以預覽容器與物件配置之結果 : 14-31

執行結果如下圖所示, 可試著改變容器水平方向之大小, 文字欄位之寬度亦會隨著 改變 : 由上述 NetBeans 之示範, 大致可以瞭解 Group Layout 如何配置物件 基本上,Group Layout 與其他的 Layout Manager 最大之不同在於, 後者均以單一限制 (Constraint) 定義各物件的配置位置, 如 Border Layout, 其限制雖分為東 南 西 北及中央五個區域, 但單一物件只會使用其中一個限制, 例如 : JButton jbutton = new JButton("OK"); add(jbutton, BorderLayout.CENTER); 但在 Group Layout 中, 則是同時以水平與垂直兩個方向獨立的群組定義各物件之配置, 在此兩群組中, 並以巢狀階層 (Nested Hierarchy) 的方式配置包括平行群組 循序群組 間隔與物件, 需注意的是, 物件必須同時存在於水平與垂直群組之中, 否則將產生 java.lang.illegalstateexception 之例外錯誤 14-32

以前述 NetBeans 示範為例, 其階層關係如下圖所示 : 14-5-2 Group Layout 之介紹 Group Layout 如同其名稱 Group( 群組 ) 一般, 以群組方式配置物件, 其主要成員包括 : 1. 水平群組 (Horizontal Group): 為 Group Layout 最上層群組之一, 可由 GroupLayout 類別的 sethorizontalgroup() 方法設定, 用以定義水平方向物件之配置, 並藉此決定水平方向物件的寬度, 包括最小 最佳及最大寬度, 如下圖所示 : 2. 垂直群組 (Vertical Group): 為 Group Layout 最上層群組之一, 可由 GroupLayout 類別的 setverticalgroup() 方法設定, 用以定義垂直方向物件之配置, 並藉此決定垂直方向物件的高度, 包括最小 最佳及最大高度, 如下圖所示 : 14-33

3. 循序群組 (Sequential Group): 如同 Box Layout 一般, 沿著水平或垂直方向依序配置物件, 各物件之位置相對於其前一物件的位置, 可由 GroupLayout 類別的 createsequentialgroup() 方法建立, 其中物件可為平行群組 循序群組 間隔 Java AWT 或 Java Swing 物件等 循序群組的大小取決於群組中各物件大小之總和, 如下圖所示 : 4. 平行群組 (Parallel Group): 如同 Overlay Layout 一般, 定義水平或垂直方向物件之對齊方式, 可由 GroupLayout 類別的 createparallelgroup() 方法建立, 其中物件可為平行群組 循序群組 間隔 Java AWT 或 Java Swing 物件等 平行群組的大小取決於群組中最大物件之尺寸 若為水平方向, 可為向上 向下或沿著物件之基準線 (Baseline) 對齊, 如下圖所示 : 14-34

若為垂直方向, 可沿著物件之前沿 (Leading) 後沿 ( Trailing) 或置中對齊, 如下圖所示 : 5. 間隔 (Gap): 如同 Box 類別一般, 定義各物件間之間隔距離, 可分為 : Gap: 一般間隔, 可由循序群組或平行群組的 addgap() 方法建立 Container Gap : 為物件與容器間之間隔, 可由循序群組的 addcontainergap() 方法建立 Preferred Gap: 為物件間之最佳間隔, 可由循序群組的 addpreferredgap() 方法建立 Automatic Gap: 由 Group Layout 依據容器的大小自動調整物件間或物件與容器間之最佳距離, 可分別由 GroupLayout 類別的 setautocreategaps() 及 setautocreatecontainergaps() 方法建立 以 Group Layout 配置物件, 需使用以下三個類別 : 1. javax.swing.grouplayout: 為 Group Layout 之主要類別, 可藉由其方法建立水平 垂直 平行及循序群組 2. javax.swing.grouplayout.sequentialgroup : 為循序群組之類別, 由 javax.swing.grouplayout 類別的 createsequentialgroup() 方法建立 3. javax.swing.grouplayout.parallelgroup : 為平行群組之類別, 由 javax.swing.grouplayout 類別的 createparallelgroup() 方法建立 茲分別說明如下 14-35