您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发
【原】浅谈Java Swing空布局,大道至简
不忘初心 2019-03-26 围观() 评论() 点赞() 【JAVA开发】
简介:JavaSwing,一个很古老的东西了,它是java用来写桌面客户端程序的,但是在BS架构发展的风生水起的今天,CS架构却几乎止步不前,不说别的,就因为UI和体
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();
}
}
非常的简单,我要实现的功能就是想让两个组件有部分的重叠,效果如下:
我们现在来设想一下,如果使用swing提供的布局,可不可以实现上这个简单的功能呢?
能,100%可以做到,但是代码可能就不止这么多了,而就拿FlowLayout和BorderLayout来说,这两个布局可以说是完全做不到,只有使用GridBagLayout这种强大的布局才可以实现。
我好像一直在说空布局的好处,那它有什么不好呢?
首当其冲的当然是坐标的计算,就如css布局一样,如果宽了高了就会将div挤得变形或者出现换行,swing的空布局也是一样,需要开发者充分的计算好坐标和组件宽高,否则就会实现不了想要的效果!
总的来说呢,在强大和灵活之间,我不想用前者,也不想完全舍弃它,我想将二者融合一下,利用空布局,再加上一些简单的布局(CardLayout、BorderLayout)方式,从而实现一些和强大的布局一样的效果。
看完文章,有任何疑问,请加入群聊一起交流!!!
很赞哦! ()
相关文章
- IntelliJ IDEA 2024.2发布之后强推新UI,如何恢复老的经典UI界面
- Uninstall hasn't detected folder of intelli] lDEA installation. Probablyuninstall.exe was moved from the installation folder.
- 公众号CPS变现新宠:微赚淘客查券返利机器人,开启智能省钱赚钱新时代
- 高返利优惠券公众号推荐
- 返利公众号可信吗安全吗?返利机器人哪个佣金高?
- 唯品会购物返利公众号大揭秘:哪些真正好用的返利公众号?
- 饿了么优惠券免费领取:哪些公众号值得推荐?
- 哪些有用可靠的微信公众号能领淘宝优惠券?
- 微信返利最高的微信号推荐——让你的购物更加实惠!
- 微信返利最高的微信号推荐
标签云
猜你喜欢
- IntelliJ IDEA 2019.2已经可以利用补丁永久破解激活了
- IntelliJ IDEA 2019.3利用补丁永久破解激活教程
- IntelliJ IDEA高版本最灵活的永久破解激活方法(含插件激活,时长你说了算)
- Jetbrains全家桶基于ja-netfilter的最新破解激活详细图文教程
- IntelliJ IDEA 2022.1永久破解激活教程(亲测可用,持续更新)
- 分享几个正版 IntelliJ IDEA 激活码(破解码、注册码),亲测可用,持续更新
- ja-netfilter到底需不需要mymap,2021.3.2版本激活失效?
- 如何激活idea2022.1及以上版本中的插件(亲测可用)
- 【史上最全】IntelliJ IDEA最新2022.1版本安装和激活视频教学(含插件)
- IntelliJ IDEA 2022.2 版本最新2099年永久激活方法,亲测可用,也可以开启新UI了。
站点信息
- 网站程序:spring + freemarker
- 主题模板:《今夕何夕》
- 文章统计:篇文章
- 标签管理:标签云
- 微信公众号:扫描二维码,关注我们