Java——Swing程序设计(窗体、布局管理器、面板)

1.创 建 窗 体

import javax.swing.JFrame;

public class MyFirstFrame extends JFrame {

	public static void main(String[] args) {
		MyFirstFrame frame = new MyFirstFrame();
		frame.setVisible(true); // 设置窗体可见,默认为不可见
	}

	public MyFirstFrame() {
		super(); // 继承父类的构造方法
		setTitle("我的窗体"); // 设置窗体的标题【前两句也可直接用super("我的窗体")代替】
		setBounds(100, 100, 500, 375); // 设置窗体的显示位置及大小,前两个参数依次为窗体左上角的点在显示器中的水平和垂直坐标,后两个参数依次为窗体的宽度和高度。
		getContentPane().setLayout(null); // 设置为不采用任何布局管理器
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗体关闭按钮的动作为退出
	}
}

2.常用布局管理器 ——负责管理组件在容器中的排列方式

(1)FlowLayout流布局管理器

它的布局方式是首先在一行上排列组件,当该行没有足够的空间时,则换行显示,当容器的大小发生改变时,将自动调整组件的排列方式。

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

public class FlowLayout_example extends JFrame {

	public FlowLayout_example() {
		super("流布局示例"); 
		setSize(250, 200);//设置窗体的大小
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		FlowLayout f =new FlowLayout();
		f.setAlignment(FlowLayout.LEFT);//设置组件的对齐方式,默认为居中显示组件
		f.setHgap(30);//设置组件的水平间距
		f.setVgap(30);//设计组件的垂直间距,水平和垂直间距默认为5像素
		setLayout(f);//设置组件容器采用流布局管理器
		
		JButton b=new JButton("按钮A");
		add(b);
		JButton bb=new JButton();
		bb.setText("按钮B");
		add(bb);
		JButton bbb=new JButton("按钮C");
		add(bbb);
	}
	
	public static void main(String args[]) {
		FlowLayout_example ff=new FlowLayout_example();
		ff.setVisible(true);
	}
}

显示效果:

(左对齐)   (居中对齐)

(2)BorderLayout边界布局管理器

它的布局方式是将容器划分为5个部分。边界布局管理器为JFrame窗体的默认布局管理器如图所示

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

public class BorderLayout_example extends JFrame {
	
	public static void main(String args[]) {
		BorderLayout_example frame = new BorderLayout_example();
		frame.setVisible(true); 
	}

	public BorderLayout_example() {
		super("边界布局管理器示例"); // 继承父类的构造方法
		setBounds(100, 100, 500, 375); 
		getContentPane().setLayout(null); 
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final BorderLayout bb = new BorderLayout(); // 创建边界布局管理器对象
		bb.setHgap(10); // 设置组件的水平间距
		bb.setVgap(10); // 设置组件的垂直间距,默认两间距为0像素
		setLayout(bb); // 设置容器采用边界布局管理器

		final JButton aButton = new JButton("按钮 A");
		add(aButton, BorderLayout.NORTH); // 组件的显示位置为顶部
		
		final JButton bButton = new JButton("按钮 B");
		add(bButton, BorderLayout.WEST); // 左测

		final JButton cButton = new JButton("按钮 C");
		add(cButton, BorderLayout.CENTER);// 中间

		final JButton dButton = new JButton("按钮 D");
		add(dButton, BorderLayout.EAST); // 右侧

		final JButton eButton = new JButton("按钮 E");
		add(eButton, BorderLayout.SOUTH); // 底部
	}
}

显示效果:

(3)GridLayout网格布局管理器

它的布局方式是将容器按照用户的设置平均划分成若干网,如下图所示。

import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

public class GridLayout_example extends JFrame {
	
	public static void main(String args[]) {
		GridLayout_example frame = new GridLayout_example();
		frame.setVisible(true); 
	}

	public GridLayout_example() {
		super("网格布局管理器示例");
		setBounds(100, 100, 300, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final GridLayout gridLayout = new GridLayout(4, 0); // 创建网格布局管理器对象,参数为行数和列数
		gridLayout.setHgap(10); // 设置组件的水平间距
		gridLayout.setVgap(10); // 设置组件的垂直间距,两间距默认为0像素
		setLayout(gridLayout); // 设置容器采用网格布局管理器

		String[][] names = { { "1", "2", "3", "+" }, { "4", "5", "6", "-" },{ "7", "8", "9", "*" }, { ".", "0", "=", "/" } };
		JButton[][] buttons = new JButton[4][4];
		for (int row = 0; row < names.length; row++) {
			for (int col = 0; col < names.length; col++) {
				buttons[row][col] = new JButton(names[row][col]);// 创建按钮对象
				add(buttons[row][col]);
			}
		}
	}
}

显示效果:

 (实现了计算器按键面板)

3.常 用 面 板

可以将面板添加到JFrame窗体中,也可以将子面板添加到上级面板中,然后将组件添加到面板中。通过使用面板,可以实现对所有组件进行分层管理,即对不同关系的组件采用不同的布局管理方式,使组件的布局更合理,使软件界面更美观。

(1)JPanel面板

首先将面板和组件添加到JFrame窗体中,然后再将子面板和组件添加到上级面板中,这样就可以向面板中添加无数个组件,并且通过对每个面板采用不同的布局管理器,真正解决众多组件间的布局问题。JPanel面板默认采用FlowLayout布局管理器。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class JPanel_Example extends JFrame {

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

	public JPanel_Example() {
		super("计算器"); 
		setResizable(false); // 设置窗体大小不可改变
		setBounds(100, 100, 230, 230);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final JPanel viewPanel = new JPanel(); // 创建显示器面板,采用默认的流布局
		getContentPane().add(viewPanel, BorderLayout.NORTH); // 将显示器面板添加到窗体顶部

		JTextField textField = new JTextField(); // 创建文本显示器
		textField.setEditable(false); // 设置显示器不可编辑
		textField.setHorizontalAlignment(SwingConstants.RIGHT); //设置文本的水平对齐方式
		textField.setColumns(18);
		viewPanel.add(textField); // 将显示器添加到显示器面板中

		final JPanel buttonPanel = new JPanel(); // 创建按钮面板
		final GridLayout gridLayout = new GridLayout(4, 0); 
		gridLayout.setVgap(10);
		gridLayout.setHgap(10);
		buttonPanel.setLayout(gridLayout); // 按钮面板采用网格布局
		getContentPane().add(buttonPanel, BorderLayout.CENTER); // 将按钮面板添加到窗体中间

		String[][] names = { { "1", "2", "3", "+" }, { "4", "5", "6", "-" },
				{ "7", "8", "9", "*" }, { ".", "0", "=", "/" } };
		JButton[][] buttons = new JButton[4][4];
		for (int row = 0; row < names.length; row++) {
			for (int col = 0; col < names.length; col++) {
				buttons[row][col] = new JButton(names[row][col]);// 创建按钮
				buttonPanel.add(buttons[row][col]); // 将按钮添加到按钮面板中
			}
		}

		final JLabel leftLabel = new JLabel(); // 创建左侧的占位标签
		leftLabel.setPreferredSize(new Dimension(10, 0)); // 设置标签的宽度
		getContentPane().add(leftLabel, BorderLayout.WEST); // 将标签添加到窗体左侧

		final JLabel rightLabel = new JLabel(); // 创建右侧的占位标签
		rightLabel.setPreferredSize(new Dimension(10, 0)); // 设置标签的宽度
		getContentPane().add(rightLabel, BorderLayout.EAST); // 将标签添加到窗体右侧

	}
}

总体思路: JFrame窗体采用边界布局,然后分别了创建一个显示器面板和按钮面板,并分别添加到JFrame窗体的顶部和中间;显示器面板采用默认的流布局,其中包含一个文本框组件;按钮面板采用网格布局,其中包含了16个按钮组件;在窗体的左右侧分别添加了一个标签组件,目的是使按钮和边框之间存在一定的距离。显示效果如下图:

   

(2)JScrollPane面板

JScrollPane类实现了一个带有滚动条的面板,用来为某些组件添加滚动条,例如JList和JTextArea组件。

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class JScrollPane_example extends JFrame {

	public JScrollPane_example() {
		super("滚动面板示例");
		setResizable(false); // 设置窗体大小不可改变
		setBounds(100, 100, 350, 200);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// 创建窗体的总的滚动面板
		final JScrollPane frameScrollPane = new JScrollPane(); 
		frameScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);//设置垂直滚动条的显示策略——一直显示
		getContentPane().add(frameScrollPane); // 将窗体滚动面板添加到窗体中
		
		//在窗体滚动面板上添加一个总的框架面板
		final JPanel framePanel = new JPanel(); 
		framePanel.setLayout(new BorderLayout()); 
		frameScrollPane.setViewportView(framePanel);
		
		//将框架面板的顶部放入类型面板
		final JPanel typePanel = new JPanel(); 
		framePanel.add(typePanel, BorderLayout.NORTH);
		
		//文本面板中包含类别标签、滚动列表和一个占位空白标签
		final JLabel typeLabel = new JLabel();
		typeLabel.setText("类别:");
		typePanel.add(typeLabel); 
		
		JScrollPane typeScrollPane = new JScrollPane(); // 创建用于JList组件的滚动面板
		typeScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		typePanel.add(typeScrollPane);
		
		String[] items = { "幽默短信类", "新年祝福短信类", "生日祝福短信类", "新婚祝福短信类" };
		
		JList list = new JList(items);
		list.setVisibleRowCount(3);//设置不滚动时可以看到的行数
		typeScrollPane.setViewportView(list);
		
		final JLabel label = new JLabel();
		label.setPreferredSize(new Dimension(110, 0));
		typePanel.add(label);
		
		//将内容面板加入框架面板中
		final JPanel contentPanel = new JPanel();
		framePanel.add(contentPanel);
		
		//内容面板包含了内容标签和文本滚动面板
		final JLabel contentLabel = new JLabel();
		contentLabel.setText("内容:");
		contentPanel.add(contentLabel);
		
		JScrollPane contentScrollPane = new JScrollPane();// 创建用于JTextArea组件的滚动面板
		contentScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);//设置水平滚动条的显示策略——不显示
		contentPanel.add(contentScrollPane);
		
		JTextArea textArea = new JTextArea();
		textArea.setRows(3);
		textArea.setColumns(20);
		textArea.setLineWrap(true); //设置为自动换行
		contentScrollPane.setViewportView(textArea);
	}

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

显示效果:

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值