FreeOZ论坛

标题: 无聊时试试Java GUI Layout [打印本页]

作者: key    时间: 22-6-2009 21:05
标题: 无聊时试试Java GUI Layout
本文只是尝试探讨一下比较常用的一些Java GUI Layout

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

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

其他Layout请有兴趣的同学继续补充
作者: key    时间: 22-6-2009 21:21
标题: 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 编辑 ]
作者: NoChoice    时间: 22-6-2009 21:40
当初学java的时候,就觉得为什么没有一个xylayout,直接设置坐标x,y就行了,还弄那么多奇怪的layout,弄得GUI很难创建
作者: key    时间: 22-6-2009 21:44
标题: 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
来确定的。
作者: key    时间: 22-6-2009 21:46
原帖由 NoChoice 于 22-6-2009 21:40 发表
当初学java的时候,就觉得为什么没有一个xylayout,直接设置坐标x,y就行了,还弄那么多奇怪的layout,弄得GUI很难创建

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

不过Java的layout的确很头痛。
我现在有事没事就只用GridBagLayout,
虽然复杂,但只用一个,再复杂,记住就好
作者: key    时间: 22-6-2009 21:49
今天发神经的困,等哪天有兴趣再写了。88
作者: 清风不写字    时间: 22-6-2009 22:14
一般只用GridBagLayout,用习惯了感觉还好。
作者: valpa    时间: 23-6-2009 08:40
key

和我一起学习python吧

不过我有很多java问题想问你呢
作者: someonehappy    时间: 23-6-2009 10:54
java的这些layout的好处是解决了控件因为窗口大小变化,或者屏幕分辨率不同而引起的缩放包括比例缩放的问题,了解以后,还是挺不错的。以前常见的windows gui开发方式,控件的位置都是定死的,缩放变化要自己写代码,很麻烦。

不过java也有根据xy绝对位置的layout,名字忘了,好像是后来的版本才有的,据说其实是给IDE用的,你直接在IDE画界面的时候,IDE就会用这种方式记录控件位置。
作者: klux    时间: 23-6-2009 17:40
awt很少用了吧。。。研究swing或者swt吧
作者: key    时间: 23-6-2009 19:42
原帖由 klux 于 23-6-2009 17:40 发表
awt很少用了吧。。。研究swing或者swt吧


layout好象没有swing什么事
作者: Tux    时间: 26-6-2009 11:30
Swing是基于AWT的,也有Layout的概念,至少1.4/1.5里是。

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

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




欢迎光临 FreeOZ论坛 (https://www.freeoz.org/ibbs/) Powered by Discuz! X3.2