跳到主要内容

插件UI基础 - awt

Java AWT(Abstract Window Toolkit)是 Java 最早提供的用于创建图形用户界面(GUI)的工具包。它为 Java 程序提供了一系列用于创建和管理窗口、按钮、文本框等 GUI 组件的类和方法。AWT 基于本地操作系统的 GUI 工具包,这意味着它创建的组件在不同操作系统上会呈现出该系统的原生风格。

创建demo工程

在idea中新建工程,语言选kotlin或java,名称为awtdemo,构建系统为intelliJ,JDK选21

基础窗口

  • 写一个基础空白窗口,运行当前文件,会弹一个空白窗口
import java.awt.Frame
fun main() {
// Frame就是窗口类
val frame: Frame = Frame()
// 设置长宽和x、y
frame.setSize(800, 600)
frame.setLocation(200, 200)
// 设置为可见
frame.setVisible(true)
}
  • panel是容器组件,里面可以放label、输入框、按钮等
  val frame = Frame("这里演示panel")
// 设置窗口的x/y/width/height
frame.setBounds(100, 100, 800, 600)
// 创建panel容器组件
val panel = Panel()
panel.setBounds(0, 0, 800, 600)
// 给panel添加label、TextField、Button
panel.add(Label("hello world"))
panel.add(TextField("im textfield"))
panel.add(Button("im button"))
// 将panel放窗口上
frame.add(panel)
// 窗口设为可见
frame.setVisible(true)
  • ScrollPane比Panel多了滚动功能,内容超出的时候可以滚动
val frame = Frame("这里演示ScrollPane")
frame.setBounds(100, 100, 800, 600)
val scrollPane = ScrollPane(ScrollPane.SCROLLBARS_ALWAYS)
for (i in 0..99) {
scrollPane.add(Button("按钮" + i))
}
frame.add(scrollPane)
frame.setVisible(true)

执行结果 : 执行后发现只显示最后一个按钮组件

提示

AWT的ScrollPane只能包含一个子组件。当你循环添加多个按钮时,实际上每次都在替换前一个按钮,最终只有最后一个按钮被添加进去。

代码修改如下可实现滚动(这里需要借助布局管理器)

val frame = Frame("这里演示ScrollPane")
frame.setBounds(100, 100, 800, 600)
val scrollPane = ScrollPane(ScrollPane.SCROLLBARS_ALWAYS)
var panel = Panel()
panel.layout = GridLayout(0, 1) // 0表示行数不限制,1列
for (i in 0..99) {
panel.add(Button("按钮" + i))
}
scrollPane.add(panel)
frame.add(scrollPane)
frame.setVisible(true)

布局管理器

窗口内子组件的布局使用布局管理器可以适配不同平台的差异,解决适配问题。

  • FlowLayout (组件排列方向:从左到右、从右向左、从中间向两边,可设置垂直间距和左右间距,默认从左到右排列)
val frame = Frame("这里演示 FlowLayout")
frame.setLayout(FlowLayout(FlowLayout.LEADING, 10, 20))
for (i in 0..99) {
frame.add(Button("按钮" + i))
}
frame.pack() // 设置最佳大小
frame.setVisible(true)
  • BorderLayout (带五个区域:东西南北中,左右伸缩的时候南北中区域会区域跟着伸缩,上下伸缩的时候东西中会伸缩)

同一个区域只支持加一个组件,否则会最后一个覆盖前面的; BorderLayout布局去掉左右控件,空间会被中间控件占用。不指定东西南北则默认是center;中间控件添加多个,都会被最后一个覆盖,所以需要将多个控件加到panel上来展示多个

val frame = Frame("这里演示 BorderLayout")
frame.setLayout(BorderLayout(10, 20))
frame.add(Button("北侧"), BorderLayout.NORTH)
frame.add(Button("南侧"), BorderLayout.SOUTH)
frame.add(Button("东侧"), BorderLayout.EAST)
frame.add(Button("西侧"), BorderLayout.WEST)
frame.add(Button("中侧"), BorderLayout.CENTER)

frame.pack()
frame.setVisible(true)