Do you drink java?



      像写情书一样coding

 

[Swing] 布局管理器 - OverlayLayout

OverlayLayout是用于排列重叠组件的布局管理器。它的用途是以一些对齐的点为基准将一些组件层叠的放置在布局容器中。

组件的横轴和纵轴的对齐点介于0.0和1.0之间。横轴(X轴)上0.0代表组件的左侧面,1.0代表组件的右侧面;纵轴(Y轴)上0.0和1.0分别代表组件的顶部和底部。

构造函数
public OverlayLayout(Container target)

因为构造函数不会为target对象安装结果布局管理器,所以我们还必须调用setLayout()来完成此功能。
JPanel p1 = new JPanel();
OverlayLayout overlay 
= new OverlayLayout(p1);
p1.setLayout(overlay); 

在OverlayLayout布局管理器中,每个组件都有一对横纵坐标值,每个组件的位置只和它本身的横纵坐标值有关,换句话说就是组件以他自己的位置作为基准,横轴上0.0和1.0分别代表组件的左侧面和右侧面;纵轴上0.0和1.0分别代表组件的顶部和底部,和容器位置无关。如果一个组件的alignmentX属性设置为0.5,原本左侧面的位置对应0.0,现在变成了0.5,那么,现在组件的位置就要向左移动width/2的距离,使左侧面的位置对应现在的0.0。纵轴亦是如此,明白了吗?

为了容易理解,我们来看《Java Swing》中关于OverlayLayout的一段样例程序,它可以编译运行。如图,你可以在输入框中调节容器中3个按钮的X,Y轴的值来看他们在容器中的位置是怎样改变的,多试几次,你就可以完全理解OverlayLayout。

OverlayTest.jpg
// OverlayTest.java
// A test of the OverlayLayout manager allowing experimentation.
//

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class OverlayTest extends JFrame {

    
public OverlayTest() {
        
super("OverlayLayout Test");
        setSize(
500300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        
final Container c = getContentPane();
        c.setLayout(
new GridBagLayout());

        
final JPanel p1 = new GridPanel();
        
final OverlayLayout overlay = new OverlayLayout(p1);
        p1.setLayout(overlay);

        
final JButton jb1 = new JButton("B1");
        
final JButton jb2 = new JButton("B2");
        
final JButton jb3 = new JButton("B3");

        Dimension b1 
= new Dimension(6050);
        Dimension b2 
= new Dimension(8040);
        Dimension b3 
= new Dimension(10060);

        jb1.setMinimumSize(b1);
        jb1.setMaximumSize(b1);
        jb1.setPreferredSize(b1);
        jb2.setMinimumSize(b2);
        jb2.setMaximumSize(b2);
        jb2.setPreferredSize(b2);
        jb3.setMinimumSize(b3);
        jb3.setMaximumSize(b3);
        jb3.setPreferredSize(b3);

        SimpleReporter reporter 
= new SimpleReporter();
        jb1.addActionListener(reporter);
        jb2.addActionListener(reporter);
        jb3.addActionListener(reporter);

        p1.add(jb1);
        p1.add(jb2);
        p1.add(jb3);

        JPanel p2 
= new JPanel();
        p2.setLayout(
new GridLayout(2,6));
        p2.add(
new JLabel("B1 X", JLabel.CENTER));
        p2.add(
new JLabel("B1 Y", JLabel.CENTER));
        p2.add(
new JLabel("B2 X", JLabel.CENTER));
        p2.add(
new JLabel("B2 Y", JLabel.CENTER));
        p2.add(
new JLabel("B3 X", JLabel.CENTER));
        p2.add(
new JLabel("B3 Y", JLabel.CENTER));
        p2.add(
new JLabel(""));

        
final JTextField x1 = new JTextField("0.0"4); // Button1 x alignment
        final JTextField y1 = new JTextField("0.0"4); // Button1 y alignment
        final JTextField x2 = new JTextField("0.0"4); 
        
final JTextField y2 = new JTextField("0.0"4); 
        
final JTextField x3 = new JTextField("0.0"4); 
        
final JTextField y3 = new JTextField("0.0"4); 

        p2.add(x1);
        p2.add(y1);
        p2.add(x2);
        p2.add(y2);
        p2.add(x3);
        p2.add(y3);


        GridBagConstraints constraints 
= new GridBagConstraints();
        c.add(p1, constraints);

        constraints.gridx 
= 1;
        JButton updateButton 
= new JButton("Update");
        updateButton.addActionListener(
new ActionListener() {
            
public void actionPerformed(ActionEvent ae) {
                jb1.setAlignmentX(
                    Float.valueOf(x1.getText().trim()).floatValue());
                jb1.setAlignmentY(
                    Float.valueOf(y1.getText().trim()).floatValue());
                jb2.setAlignmentX(
                    Float.valueOf(x2.getText().trim()).floatValue());
                jb2.setAlignmentY(
                    Float.valueOf(y2.getText().trim()).floatValue());
                jb3.setAlignmentX(
                    Float.valueOf(x3.getText().trim()).floatValue());
                jb3.setAlignmentY(
                    Float.valueOf(y3.getText().trim()).floatValue());

                p1.revalidate();
            }

        }
);
        c.add(updateButton, constraints);

        constraints.gridx 
= 0;
        constraints.gridy 
= 1;
        constraints.gridwidth 
= 2;
        c.add(p2, constraints);
    }


    
public static void main(String args[]) {
        OverlayTest ot 
= new OverlayTest();
        ot.setVisible(
true);
    }


    
public class SimpleReporter implements ActionListener {
        
public void actionPerformed(ActionEvent ae) {
            System.out.println(ae.getActionCommand());
        }

    }


    
public class GridPanel extends JPanel {
        
public void paint(Graphics g) {
            
super.paint(g);
            
int w = getSize().width;
            
int h = getSize().height;

            g.setColor(Color.red);
            g.drawRect(
0,0,w-1,h-1);
            g.drawLine(w
/2,0,w/2,h);
            g.drawLine(
0,h/2,w,h/2);
        }

    }

}



最后提醒,使用OverlayLayout布局管理器关键要记住X,Y轴对应组件位置,和容器没有关系。只要明白这一点,使用还是很简单方便的,我用OverlayLayout布局管理器clone了一个PhotoShop的工具面板。
ToolWidget.jpg

posted on 2005-11-02 23:08 leon 阅读(3838) 评论(0)  编辑  收藏 所属分类: JFC


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

公告

DSC_0106.jpg
本博客已经搬家到CSDN
http://blog.csdn.net/chenweionline




常用链接

留言簿(5)

随笔分类

随笔档案

About Technology

My Favorite Website

搜索

积分与排名

最新评论

  • 1. re: 胃痉挛
  • 兄弟们你们都做胃镜了吗开的啥药?有什么养胃秘方啊?请赐教啊!
  • --我也进来了
  • 2. re: 胃痉挛
  • @痛啊
    我感觉比生孩子还疼,生孩子还能有意识呢!这种疼还叫不出来连说话的力气都没了
  • --我也进来了
  • 3. re: 胃痉挛
  • 评论内容较长,点击标题查看
  • --我也进来了
  • 4. re: 胃痉挛
  • 我都周期性的发作,算来有4年了 。每年最少一次,一次最少2天。吃了好多药就差没去做胃镜了。 刚刚发作就随便煮了点姜汤喝下就好了些,不知道还会不会发作了。
  • --许家洛
  • 5. re: 胃痉挛
  • 我昨晚也疼的要死。。上次疼的直接120送医院了,一上120我竟然就不疼了,医院里掉了瓶盐水就放回家了。这次正好国外旅游中,几乎疼了一整晚,整个在床上翻滚状态了。今天不疼了,就是整个人难受。。。求助阿
  • --胃疼
  • 6. re: [Swing]在 JFileChooser 中进行文件验证的小技巧
  • 输入*还是会有问题
  • --ngh
  • 7. re: 胃痉挛[未登录]
  • 昨晚一夜的身不如死的感觉,胃痉挛兄不要来了吧 ,求你了
  • --李飞
  • 8. re: 胃痉挛
  • 评论内容较长,点击标题查看
  • --daidai
  • 9. re: 胃痉挛
  • 评论内容较长,点击标题查看
  • --痛啊
  • 10. re: 胃痉挛
  • 妈啊 痛的快死了~!第一次感觉过这样的痛啊~!和女的生孩子有的一比了吧~!哭哭哭~!
  • --痛啊

阅读排行榜