【错误记录】Java AWT 图形界面编程问题 ( 组件按照布局要求设置后无法显示等各种问题 )

2023-03-30 19:02:19 浏览数 (2)

文章目录

  • 一、问题描述
  • 二、在对话框中设置了组件不显示的问题
  • 三、Frame 窗口设置组件位置失效
  • 四、线性布局组件显示大小设置
  • 五、容器的多重嵌套问题
  • 六、对话框多次打开问题
  • 七、界面跳转闪烁问题

一、问题描述


最近尝试使用 Java AWT 图形界面编程 绘制一个小界面 , 用了一周多 , 恶心坏了 ;

经常遇到 按照 布局要求 设置好代码后 , 布局不显示 , 刷新不及时 , 显示一半布局等问题 ;

在本篇博客中整理下遇到的问题 ;

AWT 不是一般的难用 , 赶紧学 Swing ;

二、在对话框中设置了组件不显示的问题


先显示 Dialog 对话框 , 然后根据操作需求生成指定数量的组件 , 显示在对话框中 ;

动态添加组件后 , 发现添加的组件都无法显示 ;

最后发现需要在添加后 , 调用一次 Frame#setVisibility(true) 方法 , 设置以下窗口的可见性 , 最终才能将动态添加的组件更新上去 ;

只要组件发生了改动 , 就调用一次 Frame#setVisibility(true) 方法 , 多调用几次反正又不报错 ;

组件在设置前窗口已经显示 , 那么在设置了新组件之后 , 建议再次调用 Frame#setVisibility(true) 再次显示一次窗口 ;

三、Frame 窗口设置组件位置失效


在 Frame 窗口 中设置组件 的位置和大小 , 发现设置无效 ;

最终发现 Frame 窗口的默认布局是 BorderLayout , 默认添加组件是添加在中心的 , 默认填充整个 CENTER 区域 ;

如果想要在窗口中精确控制某个组件或容器的显示位置和大小 , 那么就要取消 Frame 窗口的默认布局 , 调用

代码语言:javascript复制
Frame#setLayout(null)

取消布局 , 所有的组件和容器的显示位置和显示大小 , 全部都手动控制 , 这样可以随心所意设置界面的布局样式 ;

四、线性布局组件显示大小设置


在 Box 或者使用 BoxLayout 的 Panel 容器中 , 向其中添加的组件默认填充整个布局 , 这里需要设置大小来限制布局 ;

使用 Component#setSize 设置的大小是无效的 ;

必须使用 Component#setMaximumSize 设置最大大小来显示组件 ;

五、容器的多重嵌套问题


Container A 容器中 嵌套 Container B , Container B 中嵌套 组件 C ;

那么 设置 组件时 , 创建完 容器 B , 不要马上添加到 容器 A 中 , 一定要按照 嵌套顺序 进行操作 , 建议的操作顺序如下 :

创建容器 A -> 创建容器 B -> 创建组件 C -> 组件 C 添加到容器 B -> 容器 B 添加到容器 A -> 设置 Frame#setVisibility(true) 显示窗口

这样操作是最不容易出问题的 , 出现过一次显示部分布局的情况 , 按照上述问题进行操作 ,

六、对话框多次打开问题


在界面开发时 , 经常遇到点击按钮弹出对话框的问题 ;

多次点击会弹出很多对话框 , 这里建议将 Dialog 设置为成员属性 , 在创建 Dialog 对话框前 先判断该 Dialog 变量是否不为空 , 如果不为空 则先调用 Dialog#dispose 先关闭一下对话框 ;

代码语言:javascript复制
        if (mDialog != null) {
            mDialog.dispose();
        }

这样可以保证始终只显示一个新的对话框 , 打开新对话框时会关闭前一个对话框 ;

七、界面跳转闪烁问题


每个独立的功能都封装在一个单独的 Frame 窗口中 , 如 配置窗口 , 操作窗口 , 日志窗口等 , 各个窗口之间跳转时 , 需要创建并显示 Frame 实例 , 这样导致屏幕闪烁 ;

推荐方案 : 只创建一个 Frame 窗口 , 不同的功能封装成不同的 Panel , 切换功能时 , 只更换 Panel 容器 , 这样就避免了 Frame 窗口的创建和显示

0 人点赞