Java窗口组件布局

Flow 布局

下面代码通过一个简单的Flow布局程序介绍基本的Java GUI程序写法:

package gui;

import java.awt.*;
import javax.swing.*;
public class Frame1 extends JFrame {
	public Frame1(String title) {
		super(title);
		Container container = getContentPane();			// 获取框架内容窗格
		container.add(new JButton("确定"));
		container.add(new JButton("取消"));
//		**** 窗口设置 ****
//		remove(btn);	// 移除组件
		setVisible(true);	// 设置窗口是否可见
		setSize(300, 200);	// 设置窗口尺寸
		setLocation(400, 400);	// 设置窗口的位置
//		setBounds(x, y, width, height);	// 等效于上面两个方法
		setResizable(false);	// 设置窗口是否可以缩放
//		dispose();	//	撤销和释放当前窗口
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);	// 设置窗口关闭方式
		FlowLayout flow_layout = new FlowLayout(FlowLayout.LEFT);	// 创建浮动布局对象
		setLayout(flow_layout);				// 设置布局
	}
	public static void main(String[] args) {
		Frame1 f = new Frame1("空洞骑士");
	}
}

Border 布局

上北下南左西右东,外加一个中间。

package gui;

import java.awt.*;
import javax.swing.*;
public class Frame2 extends JFrame {
	public Frame2(String title) {
		super(title);
		Container container = getContentPane();			// 获取框架内容窗格
//		**** 窗口设置 ****
		setVisible(true);								// 设置窗口是否可见
		setSize(300, 200);								// 设置窗口尺寸
		setLocation(400, 400);							// 设置窗口的位置
		setResizable(false);							// 设置窗口是否可以缩放
		setDefaultCloseOperation(EXIT_ON_CLOSE);		// 设置关闭后销毁程序
		setLayout(new BorderLayout());					// 设置布局
//		**** 添加组件 ****
		container.add(new JButton("EAST"), BorderLayout.EAST);
		container.add(new JButton("WEST"), BorderLayout.WEST);
		container.add(new JButton("SOUTH"), BorderLayout.SOUTH);
		container.add(new JButton("NORTH"), BorderLayout.NORTH);
		container.add(new JButton("CENTER"), BorderLayout.CENTER);
	}
	public static void main(String[] args) {
		Frame2 f = new Frame2("空洞骑士");
	}
}

Grid 布局

网格布局,和CSS中的Grid差不多。

package gui;

import java.awt.*;
import javax.swing.*;
public class Frame2 extends JFrame {
	public Frame2(String title) {
		super(title);
		Container container = getContentPane();			// 获取框架内容窗格
//		**** 窗口设置 ****
		setVisible(true);								// 设置窗口是否可见
		setSize(300, 200);								// 设置窗口尺寸
		setLocation(400, 400);							// 设置窗口的位置
		setResizable(false);							// 设置窗口是否可以缩放
		setDefaultCloseOperation(EXIT_ON_CLOSE);		// 设置关闭后销毁程序
		setLayout(new GridLayout(3, 4));					// 设置布局
//		**** 添加组件 ****
		container.add(new JButton("小骑士"));
		container.add(new JButton("小骑士"));
		container.add(new JButton("小骑士"));
		container.add(new JButton("小骑士"));
		container.add(new JButton("小骑士"));
		container.add(new JButton("小骑士"));
		container.add(new JButton("小骑士"));
		container.add(new JButton("小骑士"));
		container.add(new JButton("小骑士"));
		container.add(new JButton("小骑士"));
		container.add(new JButton("小骑士"));
		container.add(new JButton("小骑士"));
	}
	public static void main(String[] args) {
		Frame2 f = new Frame2("空洞骑士");
	}
}
效果

null 布局

使用每个组件的setBounds()进行绝对定位。

package gui;

import java.awt.*;
import javax.swing.*;
public class Frame2 extends JFrame {
	public Frame2(String title) {
		super(title);
		Container container = getContentPane();			// 获取框架内容窗格
//		**** 窗口设置 ****
		setVisible(true);								// 设置窗口是否可见
		setSize(300, 200);								// 设置窗口尺寸
		setLocation(400, 400);							// 设置窗口的位置
		setResizable(false);							// 设置窗口是否可以缩放
		setDefaultCloseOperation(EXIT_ON_CLOSE);		// 设置关闭后销毁程序
		setLayout(null);					// 设置布局
//		**** 添加组件 ****
		JButton button = new JButton("小骑士");
		container.add(button);
		button.setBounds(30, 10, 100, 50);
	}
	public static void main(String[] args) {
		Frame2 f = new Frame2("空洞骑士");
	}
}

常用组件

  • Jlabel(标签)
  • JTextField(文本框)
  • JTexArea(文本区/文本域)
  • Jbutton(按钮)
  • JPanel(面板)
  • JCheckBox(选择框/复选框)
  • JRadioButton(单选按钮)
  • JComboBox(下拉列表)
  • JPasswordField(密码框)

下面通过一个大杂烩来引入:

package gui;

import java.awt.*;
import javax.swing.*;
import javax.swing.border.Border;
public class Frame2 extends JFrame {
	public Frame2(String title) {
		super(title);
		Container container = getContentPane();			// 获取框架内容窗格
//		**** 添加组件 ****
//		菜单组件
		String[] items = {"吉欧", "泪水之城"};
		JComboBox combo = new JComboBox(items);
		combo.addItem("十字路口");
		container.add(combo);
//		文本输入框组件
		container.add(new TextField("请输入文本...", 5));
		container.add(new JButton("小骑士"));
//		单选按钮组合
		ButtonGroup group = new ButtonGroup();
		JRadioButton btn1 = new JRadioButton("假骑士");
		JRadioButton btn2 = new JRadioButton("真骑士");
		group.add(btn1);
		group.add(btn2);
		container.add(btn1);
		container.add(btn2);
//		文本区域
		container.add(new JTextArea("输入..", 3, 11));
//		设置窗口的可见需要放到最后
		setSize(400, 300);								// 设置窗口尺寸
		setLocation(400, 400);							// 设置窗口的位置
		setResizable(false);							// 设置窗口是否可以缩放
		setDefaultCloseOperation(EXIT_ON_CLOSE);		// 设置关闭后销毁程序
		container.setLayout(new FlowLayout());			// 设置布局
		setVisible(true);								// 设置窗口是否可见
//		密码框
		container.add(new JLabel("密码:"));
		container.add(new JPasswordField(20));		
//		复选框
		container.add(new JCheckBox("前端"));
		container.add(new JCheckBox("游戏开发"));
	}
	public static void main(String[] args) {
		Frame2 f = new Frame2("空洞骑士");
	}
}

Panel 面板

package gui;

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

public class Frame3 extends JFrame {
	Frame3() {
		super("空洞骑士");
		
		Container container = getContentPane();
		container.setLayout(new BorderLayout());
		JPanel p1 = new JPanel(new GridLayout(1, 1));
		JPanel p2 = new JPanel(new GridLayout(5, 7));
		container.add(p1, BorderLayout.NORTH);
		container.add(p2, BorderLayout.CENTER);
		
		p1.add(new JButton("讲台"));
		
//		向 p2 中加入九个按钮
		for (int i = 0; i <= 34; i ++) {
			p2.add(new JButton("座位" + String.valueOf(i)));
		}
		setSize(550, 700);
		setResizable(false);
		setLocation(400, 100);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
	}
	public static void main(String[] args) {
		Frame3 f = new Frame3();
	}
}

实现效果:

事件

btn这个按钮添加一个事件绑定,原理为使用匿名函数实现接口。

btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				for (JTextField tf : all_text) {
					tf.setText("");
				}
			}
		});

综合项目

实现一个简单的计算功能:

package gui;

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

public class Frame5 extends JFrame {
	Frame5() {
		super("求根公式");
		Container con = getContentPane();
		con.setLayout(new GridLayout(7, 2));
		
		con.add(new JLabel("a"));
		JTextField a = new JTextField();
		con.add(a);
		
		con.add(new JLabel("b"));
		JTextField b = new JTextField();
		con.add(b);
		
		con.add(new JLabel("c"));
		JTextField c = new JTextField();
		con.add(c);
		
		con.add(new JLabel("点此清空"));
		JButton clear = new JButton("清空");
		con.add(clear);
		
		con.add(new JLabel("点此求解"));
		JButton solve = new JButton("求解");
		con.add(solve);
		
		con.add(new JLabel("x1"));
		JTextField x1 = new JTextField();
		con.add(x1);
		
		con.add(new JLabel("x2"));
		JTextField x2 = new JTextField();
		con.add(x2);
		
//		所有文本框数组
		JTextField[] all_text = {a, b, c, x1, x2};

//		清空接口实现
		clear.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				for (JTextField tf : all_text) {
					tf.setText("");
				}
			}
		});

//		求解接口实现
		solve.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
//				利用正则表达式匹配防止输入非数字时控制台报错
				if (!isNumber(a.getText()) || !isNumber(b.getText()) || !isNumber(c.getText())) return;
				double A = Double.parseDouble(a.getText());
				double B = Double.parseDouble(b.getText());
				double C = Double.parseDouble(c.getText());
//				System.out.println("sum:"+(A+B+C));
				if (A == 0 || (B*B-4*A*C) < 0) {
					x1.setText("###");
					x2.setText("###");
				} else {
					x1.setText("" + ((-B + Math.sqrt(B*B-4*A*C)) / 2 * A) );
					x2.setText("" + ((-B - Math.sqrt(B*B-4*A*C)) / 2 * A) );
				}
			}
		});
		
//		窗口预设
		setVisible(true);
		setSize(350, 350);
		setLocation(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	public static boolean isNumber(String str) {
		if (str != null && str.matches("-?\\d+(\\.\\d+)?")) {
			return true;
		} else {
			return false;
		}
	}
	public static void main(String[] args) {
		Frame5 f = new Frame5();
	}
}
作者:Sy_
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇