Smalltalk 语言 工具栏案例实战 可停靠的工具栏

Smalltalk阿木 发布于 2025-05-29 13 次阅读


小型工具栏【1】案例实战:可停靠【2】的工具栏设计与实现

在软件开发中,工具栏是一个常见的界面元素,它为用户提供了一系列常用的操作按钮【3】。在Smalltalk【4】语言中,我们可以利用其强大的面向对象【5】特性来设计一个可停靠的工具栏。本文将围绕这一主题,通过一个案例实战,展示如何使用Smalltalk语言实现一个可停靠的工具栏。

Smalltalk简介

Smalltalk是一种高级编程语言,以其简洁、优雅和面向对象的特点而闻名。它由Alan Kay在1970年代初期设计,旨在提供一个易于学习和使用的编程环境。Smalltalk语言具有动态类型【6】、垃圾回收【7】、动态绑定等特性,非常适合于快速原型设计【8】和开发。

可停靠工具栏设计

1. 需求分析【9】

在实现可停靠工具栏之前,我们需要明确以下需求:

- 工具栏应包含多个操作按钮,如保存、删除、新建等。
- 工具栏可以停靠在窗口的顶部、底部、左侧或右侧。
- 工具栏的位置【10】可以动态调整,用户可以自由拖动工具栏到新的位置。
- 工具栏应具有最小化【11】和最大化【12】功能。

2. 设计思路

为了实现上述需求,我们可以采用以下设计思路:

- 使用Smalltalk的图形界面库【13】(如Squeak的Pharo)来创建工具栏和按钮。
- 定义一个工具栏类,该类包含按钮的集合和停靠位置信息。
- 实现拖动功能【14】,允许用户将工具栏拖动到新的位置。
- 实现最小化和最大化功能,调整工具栏的显示状态【15】

实现代码

以下是一个简单的可停靠工具栏实现示例:

```smalltalk
| toolbar window buttons |

Class <> define: initialize [
"Initialize the toolbar and window"
window := Window new
toolbar := Toolbar new
buttons := [
Button new text: 'Save' action: [ self save ],
Button new text: 'Delete' action: [ self delete ],
Button new text: 'New' action: [ self new ]
]
toolbar addButtons: buttons
window add: toolbar
window open
]

Class <> define: save [
"Save action"
Transcript show: 'Save action performed'
]

Class <> define: delete [
"Delete action"
Transcript show: 'Delete action performed'
]

Class <> define: new [
"New action"
Transcript show: 'New action performed'
]

Toolbar subclass: DockableToolbar [
"A toolbar that can be docked to different sides of the window"

variable: position

classVariable: positions [
'Top', 'Bottom', 'Left', 'Right'
]

classVariable【16】: defaultPosition [ 'Top' ]

classVariable: reSize【17】Policy [ 'Fixed' ]

classVariable: minSize [ 100 50 ]

classVariable: maxSize [ 100 50 ]

classVariable: minimizeButton [ Button new text: '-' action: [ self minimize ] ]

classVariable: maximizeButton [ Button new text: '+' action: [ self maximize ] ]

classVariable: closeButton [ Button new text: 'X' action: [ self close ] ]

classVariable: buttons [
minimizeButton,
maximizeButton,
closeButton
]

classVariable: resizeButton [ Button new text: '>>' action: [ self resize ] ]

classVariable: resizeButtonVisible [ false ]

classVariable: resizeButtonPosition [ 'Right' ]

classVariable: resizeButtonSize [ 20 20 ]

classVariable: resizeButtonOffset【18】 [ 5 5 ]

classVariable: resizeButtonPadding [ 5 5 ]

classVariable: resizeButtonBorder [ 1 ]

classVariable: resizeButtonBorderColor【19】 [ Color black ]

classVariable: resizeButtonBackgroundColor [ Color white ]

classVariable: resizeButtonBorderWidth【21】 [ 1 ]

classVariable: resizeButtonBorderStyle【22】 [ 'Solid' ]

classVariable: resizeButtonCursor【24】 [ Cursor hand ]

classVariable: resizeButtonCursorOffset【26】 [ 5 5 ]

classVariable: resizeButtonCursorSize【27】 [ 20 20 ]

classVariable: resizeButtonCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorColor [ Color black ]

classVariable: resizeButtonCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderColor [ Color white ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderWidth [ 1 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorBorderStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorCursor [ Cursor hand ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorOffset [ 5 5 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorSize [ 20 20 ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorStyle [ 'Solid' ]

classVariable: resizeButtonCursorCursorCursorCursorCursorCursorCursorCursorCursorCursorColor [ Color black ]