找回密码
 FreeOZ用户注册
查看: 1974|回复: 11
打印 上一主题 下一主题

[论坛技术] 无聊时试试Java GUI Layout

[复制链接]
跳转到指定楼层
1#
发表于 22-6-2009 22:05:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
本文只是尝试探讨一下比较常用的一些Java GUI Layout

常用的Java AWT自带的Layout有哪些?个人认为有下面七种:

1. BorderLayout
2. BoxLayout
3. CardLayout
4. FlowLayout
5. GridBagLayout
6. GridLayout
7. GroupLayout

其他Layout请有兴趣的同学继续补充
回复  

使用道具 举报

2#
 楼主| 发表于 22-6-2009 22:21:16 | 只看该作者

BorderLayout

我一直不明白为什么要叫这种Layout叫BorderLayout,咱们中国人可能会管他叫做东南西北中layout。
这种layout还是Frame, JFrame的缺省layout。而Panel的缺省布局则是FlowLayout。

为什么Sun这么喜欢这种布局呢?不明白。

BorderLayout的典型案例如下:
  1. import javax.swing.*;
  2. import java.awt.*;

  3. public class LayoutTest2 {
  4.         public static void main(String [] args) {
  5.                 JFrame frame = new JFrame("Test 2");
  6.                
  7.                 frame.add(new JButton("North"), BorderLayout.NORTH);
  8.                 frame.add(new JButton("South"), BorderLayout.SOUTH);
  9.                 frame.add(new JButton("East"), BorderLayout.EAST);
  10.                 frame.add(new JButton("West"), BorderLayout.WEST);
  11.                 frame.add(new JButton("Center"), BorderLayout.CENTER);
  12.                
  13.                 frame.pack();
  14.                 frame.setVisible(true);
  15.         }
  16. }
复制代码
我们知道一个Component可以设置其MaximunSize,但这个size设置对于某些Layout不起作用,
BorderLayout就是其一:
  1. import javax.swing.*;
  2. import java.awt.*;

  3. public class LayoutTest {
  4.         public static void main(String [] args)
  5.         {
  6.                 JFrame frame = new JFrame("Layout test");
  7.                 JButton button = new JButton("Hello world");
  8.                
  9.                 Dimension dim = button.getPreferredSize();
  10.                 button.setMaximumSize(dim);
  11.                
  12.                 frame.add(new JButton("Hello world"));
  13.                 frame.pack();
  14.                 frame.setVisible(true);
  15.         }
  16. }
复制代码
这里frame缺省使用了BorderLayout,而button被加入到center去了。虽然设置了MaximumSize,
但事实上并没有起效果。

[ 本帖最后由 key 于 22-6-2009 21:30 编辑 ]

评分

参与人数 1威望 +30 收起 理由
ubuntuhk + 30 谢谢分享!

查看全部评分

回复  

使用道具 举报

3#
发表于 22-6-2009 22:40:25 | 只看该作者
当初学java的时候,就觉得为什么没有一个xylayout,直接设置坐标x,y就行了,还弄那么多奇怪的layout,弄得GUI很难创建
回复  

使用道具 举报

4#
 楼主| 发表于 22-6-2009 22:44:05 | 只看该作者

FlowLayout

个人认为,FlowLayout的名字很优雅。当你用FlowLayout列出各种控件时,
你会觉得特别舒服……这是很纯粹的个人观点,有点困了,梦呓中。

事实上FlowLayout功能很简单,它就是把控件在container上按一定次序
顺次摆下。所以Flow这个名字比较合适。

FlowLayout是Applet的缺省layout,也是Panel/JPanel的缺省Layout。
其控件是从左到右还是从右到左,则可以通过ComponentOrientation
来控制:
ComponentOrientation.LEFT_TO_RIGHT
ComponentOrientation.RIGHT_TO_LEFT
缺省是从左到右的摆。

而控件的对齐位置是由它自带的几个常量来控制的,包括了:
CENTER
LEADING
LEFT
RIGHT
TRAILING

就这么一看,对LEANING和TRAILING很不解,不就是左和右吗?
干嘛搞这么多东西。事实上因为控件可以从左到右的排,也可以从
右到左的放,采用LEADING和TRAILING是为了和这个顺序方向一至。

关于这个Layout上的元素,即控件,其大小是由它的preferredsize
来确定的。
回复  

使用道具 举报

5#
 楼主| 发表于 22-6-2009 22:46:21 | 只看该作者

xylayout是Borland的产物吧?
如果你把layout设置为null,
是可以通过绝对大小和坐标来处理的。

不过Java的layout的确很头痛。
我现在有事没事就只用GridBagLayout,
虽然复杂,但只用一个,再复杂,记住就好
回复  

使用道具 举报

6#
 楼主| 发表于 22-6-2009 22:49:41 | 只看该作者
今天发神经的困,等哪天有兴趣再写了。88
回复  

使用道具 举报

7#
发表于 22-6-2009 23:14:57 | 只看该作者
一般只用GridBagLayout,用习惯了感觉还好。
回复  

使用道具 举报

8#
发表于 23-6-2009 09:40:45 | 只看该作者
key

和我一起学习python吧

不过我有很多java问题想问你呢
回复  

使用道具 举报

9#
发表于 23-6-2009 11:54:21 | 只看该作者
java的这些layout的好处是解决了控件因为窗口大小变化,或者屏幕分辨率不同而引起的缩放包括比例缩放的问题,了解以后,还是挺不错的。以前常见的windows gui开发方式,控件的位置都是定死的,缩放变化要自己写代码,很麻烦。

不过java也有根据xy绝对位置的layout,名字忘了,好像是后来的版本才有的,据说其实是给IDE用的,你直接在IDE画界面的时候,IDE就会用这种方式记录控件位置。
回复  

使用道具 举报

10#
发表于 23-6-2009 18:40:02 | 只看该作者
awt很少用了吧。。。研究swing或者swt吧
回复  

使用道具 举报

11#
 楼主| 发表于 23-6-2009 20:42:35 | 只看该作者
原帖由 klux 于 23-6-2009 17:40 发表
awt很少用了吧。。。研究swing或者swt吧


layout好象没有swing什么事
回复  

使用道具 举报

12#
发表于 26-6-2009 12:30:28 | 只看该作者
Swing是基于AWT的,也有Layout的概念,至少1.4/1.5里是。

当初懒,就用JBuilder和Eclipse的插件拖,结果后者生成的代码好烂!xyLayout应该不是Sun的东西。

当初学习Java写了个IPSearch,花了不少时间。Java Swing作UI真是活受罪。SWT相对好一些,应该都是通过JNI调OS的API,所以速度上接近于native的...
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 6-4-2025 07:11 , Processed in 0.023566 second(s), 29 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表