首页   >   代码编程

浅谈Java Swing空布局,大道至简

Java Swing,一个很古老的东西了,它是java用来写桌面客户端程序的,但是在BS架构发展的风生水起的今天,CS架构却几乎止步不前,不说别的,就因为UI体积这两个问题,就是横在它面前的两座大山,同样一个产品,用其他CS架构的语言来实现,比使用swing来实现要简单的多,这也似乎注定了它的前途一片黑暗(至少目前看起来如此,官方也没有任何改进优化的意思,似乎已经放弃了它)。

但是这个东西也不是一文不值的,它虽然UI丑到爆炸,但是使用了超级多的java设计模式,也还是有值得学习的地方,今天我们来聊一下它的布局Layout。

跟Android很像,它也提供了一系列的布局方式:FlowLayout、BorderLayout、CardLayout、GridLayout、BoxLayout、GridBagLayout等等,越是复杂的布局功能越是强大,同时使用起来也越是麻烦。

我在很早学习它的时候,对这几个布局了解的不是太深入,每次用的最多的就是前三种,后面的几乎没怎么用过,到了后来,我使用的最多的反而是空布局,也就是不用布局了,直接使用坐标定位组件的位置,导致我一直到现在对其他的几种布局都不是太熟悉,但是我也渐渐的觉着搞这么多花里胡哨的东西,其实用的并不多,我在学习了前端之后,这种感触也越来越深,有的时候我只是想实现一个很小的功能,但是却非要使用一种布局,这并不是我想要的。

大道至简,做事情呢,越简单越好,写代码和做设计也是一样,能简单就绝不弄得太复杂,给大家看一段代码:

package feiqq.ui.frame;

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

/**
 * Created by SongFei on 2019/3/21.
 */
public class TestFrame extends JFrame {

    public TestFrame() {
        super();
        initGUI();
    }

    private void initGUI() {
        // 设置窗体大小
        setSize(600, 500);
        // 设置关闭方式
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        // 设置窗体打开处于屏幕中央
        setLocationRelativeTo(null);
        // 设置窗体可见
        setVisible(true);

        // 默认的内容Container,可以自己替换掉
//        getContentPane();

        // 自定义内容面板
        final JPanel contentPane = new JPanel();
        // 空布局,个人感觉更好控制
        contentPane.setLayout(null);
        // 设置边框
        // contentPane.setBorder(BorderFactory.createLineBorder(Color.GREEN));
        // 替换默认的Container
        setContentPane(contentPane);

        JButton button = new JButton();
        // 设置定位,因为父容器用了空布局,所以需要指定坐标位置
        button.setBounds(10, 10, 200, 200);
        // 设置文字
        button.setText("我就想将这个按钮放到这里");
        // 设置字体
        button.setFont(new Font("楷体", Font.PLAIN, 16));
        // 添加事件
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(contentPane, "Test");
            }
        });
        // 将组件添加到内容面板
        contentPane.add(button);

        JLabel label = new JLabel();
        label.setText("我就是想和按钮有重叠的部分");
        label.setBounds(20, 20, 400, 100);
        label.setHorizontalAlignment(SwingConstants.RIGHT);
        label.setBorder(BorderFactory.createLineBorder(Color.RED));
        contentPane.add(label);
    }

    public static void main(String[] args) {
        new TestFrame();
    }

}

非常的简单,我要实现的功能就是想让两个组件有部分的重叠,效果如下:

浅谈Java Swing空布局,大道至简

我们现在来设想一下,如果使用swing提供的布局,可不可以实现上这个简单的功能呢?

能,100%可以做到,但是代码可能就不止这么多了,而就拿FlowLayout和BorderLayout来说,这两个布局可以说是完全做不到,只有使用GridBagLayout这种强大的布局才可以实现。

我好像一直在说空布局的好处,那它有什么不好呢?

首当其冲的当然是坐标的计算,就如css布局一样,如果宽了高了就会将div挤得变形或者出现换行,swing的空布局也是一样,需要开发者充分的计算好坐标和组件宽高,否则就会实现不了想要的效果!

总的来说呢,在强大和灵活之间,我不想用前者,也不想完全舍弃它,我想将二者融合一下,利用空布局,再加上一些简单的布局(CardLayout、BorderLayout)方式,从而实现一些和强大的布局一样的效果。

QQ群: 686430774  /  718410762

站长Q: 1347384268

如果文章有帮到你,可以考虑请博主喝杯咖啡!

分享到:

欢迎分享本文,转载请注明出处!

作者:不忘初心

发布时间:2019-03-26

永久地址:https://www.jiweichengzhu.com/article/c55012bc56e14afa8c5570b5b9ffe3da

评论