Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 954|回复: 0

[Swing学习]Swing布局管理器 - OverlayLayout

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-6 23:56:12 | 显示全部楼层 |阅读模式
    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.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(500, 300);
            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(60, 50);
            Dimension b2 = new Dimension(80, 40);
            Dimension b3 = new Dimension(100, 60);

            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的工具面板。




      
      
       
       

         
       

         
       
      



    源码下载:http://file.javaxxz.com/2014/11/6/235611890.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 10:48 , Processed in 0.307676 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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