Swing中的顶级容器与布局

zhaoleiFree / 2023-09-09 / 原文

1. 顶级容器

JFrame(框架):表示主程序窗口

package top.level.container;


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

public class TopLevelContainerDemo {

    public static void main(String[] args) {
        JFrame jFrame = new JFrame("第一个Swing窗体");
        //获取JFrame根节点的Container,此Container可以添加组件
        Container contentPane = jFrame.getContentPane();
        contentPane.add(new JLabel("这是一个窗体"));
        //设置默认的关闭窗体的动作,这里设置为关闭窗体之后推出程序
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //将窗口显示的位置设置为屏幕的正中间
        center(jFrame);
        jFrame.setSize(new Dimension(500,350));
        jFrame.setVisible(true);
    }
    public static JFrame center(JFrame jFrame){

        // 1、获取窗体的宽和高
        int widthFrame = jFrame.getWidth();
        int heightFrame = jFrame.getHeight();
        // 2、获取屏幕的宽和高
        Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
        Dimension screenSize = defaultToolkit.getScreenSize();
        double widthScreen = screenSize.getWidth();
        double heightScreen = screenSize.getHeight();
        // 3、如果窗体的尺寸超过了,则直接用屏幕的尺寸
        if (widthFrame > widthScreen){
            widthFrame = (int)widthScreen;
        }
        if (heightFrame > heightScreen){
            heightFrame = (int)heightScreen;
        }
        // 4、设置位置
        int positionX = (int) ((widthScreen - widthFrame)/2);
        int positionY = (int)((heightScreen - heightFrame)/2);

        jFrame.setSize(new Dimension(widthFrame,heightFrame));
        jFrame.setLocation(new Point(positionX,positionY));

        return jFrame;
    }
}

JDialog(对话框):每个JDialog对象表示一个对话框,对话框属于二级窗口

package top.level.container;

import utils.Utils;

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

public class TopLevelContainerDialog {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("模拟dialog");
        jFrame.setSize(500,350);
        Utils.centerFrame(jFrame);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JButton jButton = new JButton("点击打开dialog");
        JDialog jDialog = new JDialog(jFrame,"Dialog",true);
        jDialog.setSize(100,75);
        jDialog.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
        jDialog.setLocationRelativeTo(jFrame);
//        jDialog.setLocation(jFrame.getWidth()/2,jFrame.getHeight()/2);
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jDialog.setVisible(true);
            }
        });
        jFrame.getContentPane().add(jButton);
        jFrame.setVisible(true);
    }
}

 

JApplet(小程序):在浏览器内显示一个小程序界面

2. 布局方式

1、 边界布局(BorderLayout)

 

package layout;

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

public class SwingBorderLayoutDemo {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("边界布局");
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.setLocationRelativeTo(null);
        jFrame.setSize(new Dimension(500,350));
        Container contentPane = jFrame.getContentPane();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(new JLabel("南"),BorderLayout.SOUTH);//南边
        contentPane.add(new JLabel("北"),BorderLayout.NORTH);//北边
        contentPane.add(new JLabel("中"),BorderLayout.CENTER);//中间
        contentPane.add(new JLabel("西"),BorderLayout.WEST);//西边
        contentPane.add(new JLabel("西"),BorderLayout.EAST);//东边
        jFrame.setVisible(true);
    }
}

 

2、流式布局(FlowLayout)

package layout;

import javax.swing.*;
import javax.swing.plaf.PanelUI;
import java.awt.*;

public class SwingFlowLayoutDemo {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("边界布局");
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.setLocationRelativeTo(null);
        jFrame.setSize(new Dimension(500,350));
        Container contentPane = jFrame.getContentPane();
        contentPane.setLayout(new FlowLayout(FlowLayout.LEADING));
        jFrame.add(new JButton("按钮1"));
        jFrame.add(new JButton("按钮2"));
        jFrame.add(new JButton("按钮3"));
        jFrame.setBackground(Color.BLUE);
        jFrame.setVisible(true);
    }
}

 

3、网格布局(GridLayout)

package layout;

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

public class SwingGridLayoutDemo {
    public static void main(String[] args) {
        //1.创建Frame对象,并且标题设置为计算器
        JFrame frame = new JFrame("计算器");
        //2.创建一个Panel对象,并且往Panel中放置一个TextField组件
        JPanel p1 = new JPanel();
        p1.add(new JTextField(30));
        //3.把上述的Panel放入到Frame的北侧区域
        frame.add(p1, BorderLayout.NORTH);
        //4.创建一个Panel对象,并且设置其布局管理器为GridLayout
        JPanel p2 = new JPanel();
        p2.setLayout(new GridLayout(3,5,4,4));
        //5.往上述Panel中,放置15个按钮,内容依次是:0,1,2,3,4,5,6,7,8,9,+,-,*,/,.
        for (int i = 0; i < 10; i++) {
            p2.add(new Button(i+""));
        }
        p2.add(new Button("+"));
        p2.add(new Button("-"));
        p2.add(new Button("*"));
        p2.add(new Button("/"));
        p2.add(new Button("."));
        //6.把上述Panel添加到Frame的中间区域中国
        frame.add(p2);
        //7.设置Frame为最佳大小
        frame.pack();

        //8.设置Frame可见
        frame.setVisible(true);
    }
}

 

4、盒子布局(BoxLaYout)

package layout;

import utils.Utils;

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

public class SwingBoxLaLayoutDemo {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("盒子布局");
        Utils.centerFrame(jFrame);
        Container contentPane = jFrame.getContentPane();
        Box hBox = Box.createHorizontalBox();
        hBox.add(new Button("水平按钮一"));
        hBox.add(new Button("水平按钮二"));
        jFrame.add(hBox,BorderLayout.NORTH);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.pack();
        jFrame.setVisible(true);
    }
}

 

5、空布局(null)