SWING ! SWING !

GUI

Swing 控件称为“轻量级控件”,基于AWT的JAVA程序,在不同平台表现一致。(有待考量啊,MAC和WIN上表现上还是有差距的)

Swing 基础构建

可以简单理解为JFrame 是顶级容器,JPanel是普通容器。

  • JFrame java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。

  • JPanel Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,可以进行嵌套,功能是对窗体中具有相同逻辑功能的组件进行组合,是一种轻量级容器,可以加入到JFrame窗体中。。

Swing 布局管理

说了这么多,其实还是默认布局,setLayout(null),然后setBounds()好用。当然前提是,你的桌面客户端不用进行最大化适配,如果要用最大化适配还是需要以下布局。

  • AbsoluteLayout: 绝对布局允许在界面中以任意位置摆放组件,灵活度很高,主要通过组件位置和尺寸属性进行控制

  • Flowlayout: 布局从左到右,中间放置,一行不下换另一行,一行放多少个取决于宽度,默认居中对齐。(JPanel默认布局)

  • BorderLayout:分为东南西北中五个方位。北和南的组件可以在水平方向上拉伸,东和西的组件可以在垂直方向上拉伸,中心的组件可以同时在水平和垂直的方向上拉伸,填充剩余空间。(JDialog,JFrame,Jwindow的默认布局)

  • GridLayout:网格式的布局,窗口改变的时候,组件的大小也随之改变,每个单元格大小一样,放置组件时需按顺序,不能任意摆放,比较死,不推荐使用

  • CardLayout: 所有卡片叠在一起,每时每刻只能显示一张卡片,常用于切换界面

  • GroupLayout:手写复杂,一般用可视化工具使用,比较强大,可以控件吸附,生成的代码较为复杂

  • GridBagLayout:可完成复杂的布局,IDE有足够的支持,布局过于复杂,有许多约束条件(anchor锚点,ipadx内部填充,Weighty比重)

  • TableLayout:把容器划分为行和列,每一个行列交错形成单元格,组件被添加到容器划分好的单元格里,当容器发生伸缩时候,单元格也随之伸缩,装载在单元格里的组件也相应进行伸缩

Swing 线程安全:

线程:(进入时候JVM会启动三个线程)

  • 主线程,main入口,也叫初始化线程
  • ToolKit线程(也就是键盘,鼠标等事件的捕获线程)
  • EDT线程(将ToolKit线程捕获的事件放入一个事件队列,并且将这些事件依次分发出去)

注意:

  • 不能从其他非EDT线程来访问UI组件和事件处理器,否则可能会使程序出现非线程安全问题。
  • 不能在EDT中执行耗时任务,这会使得GUI事件被阻塞在队列中而得不到处理,使程序失去响应性。
  • SwingUtilities提供了最常用的invokeAndWait()方法和invokeLater()方法,其他线程通过这两个方法可以将代码放到事件队列中,当EDT进入该代码块后,就开始执行,并对UI组件进行安全修改。这两个方法又有所区别,invokeLater()方法是异步的,即EDT将将事件放到队列中就返回;而invokeAndWait()方法是同步的,即EDT将事件放到队列中等到其Runnable执行完毕才返回,所以 注意绝对不能使用EDT来调用invokeAndWait()方法,否则会导致死锁发生 。

Swing 问题

在开发悦游无限打包工具遇见的一些常见的问题

  • JLabel.setBackground()不起作用,设置不透明属性:setOpaque(false);

  • 在控件绑定数据使用model的时候,默认不选中,想要设置默认选中,设置setSelectedIndex(0)

  • 打包成exe软件时,使用运行时环境一般用的是1.6

  • JDialog.setModal(true);会阻塞当前代码,当对话框消失代码从此处继续执行

  • 在自定义控件的时候最好把默认属性写上,这样win和mac上才避免出现差异

  • 保存数据到本地可以使用java.util.Properties,会以(name=value)形式保存到本地

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器