使用GridBagLayout实现的计算器UI

GridBagLayout相对于GridLayout来说更灵活,功能也更强大,用它实现的计算器的布局效果图如下:

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

/**
 * Calculator类,实现计算器界面
 * @author Ares
 */
public class Calculator{
	final String[] KEYS = { "CE", "C", "←", "÷", "7", "8", "9", "×", "4","5", "6", "-", "1", "2", "3", "+", "0", ".", "=" };
	JButton[] keys = new JButton[KEYS.length];
	JTextField resultText = new JTextField("0");

	public void addComponentsToPane(Container pane) {
		GridBagLayout layout = new GridBagLayout();
		pane.setLayout(layout);
		resultText.setFont(new Font("Century Schoolbook", Font.PLAIN, 14));
		resultText.setEditable(false);
		resultText.setHorizontalAlignment(SwingConstants.RIGHT);
		pane.add(resultText,new GBC(0, 0, 4, 1).setIpad(400, 50).setWeight(0.5, 0.5).setFill(GridBagConstraints.BOTH));
		for (int i = 0; i < keys.length; i++) {
			keys[i] = new JButton(KEYS[i]);
			if(i == keys.length-3){
				pane.add(keys[i],new GBC(i % 4, i / 4 + 1,2,1).setIpad(0, 12).setInsets(1).setFill(GridBagConstraints.BOTH).setWeight(0.5, 0.5));
			}else if (i == keys.length-2 || i == keys.length-1) {
				pane.add(keys[i],new GBC(i % 4+1, i / 4 + 1).setIpad(0, 12).setInsets(1).setFill(GridBagConstraints.BOTH).setWeight(0.5, 0.5));
			}else {
				pane.add(keys[i], new GBC(i % 4, i / 4 + 1).setIpad(0, 12).setInsets(1).setFill(GridBagConstraints.BOTH).setWeight(0.5, 0.5));
			}
		}
	}

	public void createAndShowGUI() {
		JFrame frame = new JFrame("Calculator");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		addComponentsToPane(frame.getContentPane());
		frame.pack();
		frame.setVisible(true);
	}

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				new Calculator().createAndShowGUI();
			}
		});
	}
}

用来设置GridBagConstraints的类如下:

import java.awt.GridBagConstraints;
import java.awt.Insets;

public class GBC extends GridBagConstraints {
	/**
	 * 构造函数,用来设置组件所占单元格的坐标
	 *
	 * @param gridx 横向坐标
	 * @param gridy 纵向坐标
	 */
	public GBC(int gridx, int gridy) {
		this.gridx = gridx;
		this.gridy = gridy;
	}

	/**
	 * 构造函数,用来设置组件所占单元格的坐标,同时指定宽度和高度
	 * @param gridx 横向坐标
	 * @param gridy 纵向坐标
	 * @param gridwidth 组件宽度
	 * @param gridheight 组件高度
	 */
	public GBC(int gridx, int gridy, int gridwidth, int gridheight) {
		this.gridx = gridx;
		this.gridy = gridy;
		this.gridwidth = gridwidth;
		this.gridheight = gridheight;
	}

	/**
	 * 当组件没有空间大时,设置组件的位置
	 * @param anchor 组建位置
	 * @return 当前对象
	 */
	public GBC setAnchor(int anchor) {
		this.anchor = anchor;
		return this;
	}

	/**
	 * 设置填充
	 * @param fill 设置填充方式
	 * @return 当前对象
	 */
	public GBC setFill(int fill) {
		this.fill = fill;
		return this;
	}

	/**
	 * 设置组件随窗口延伸的幅度
	 * @param weightx 横向延伸大小
	 * @param weighty 纵向延伸大小
	 * @return 当前对象
	 */
	public GBC setWeight(double weightx, double weighty) {
		this.weightx = weightx;
		this.weighty = weighty;
		return this;
	}

	/**
	 * 设置组件之间的间距
	 * @param distance 上下左右间距一样
	 * @return 当前对象
	 */
	public GBC setInsets(int distance) {
		this.insets = new Insets(distance, distance, distance, distance);
		return this;
	}

	/**
	 * 设置组件之间的间距
	 * @param top 上间距
	 * @param left 左间距
	 * @param bottom 底间距
	 * @param right 右间距
	 * @return 当前对象
	 */
	public GBC setInsets(int top, int left, int bottom, int right) {
		this.insets = new Insets(top, left, bottom, right);
		return this;
	}

	/**
	 * 设置组件内部填充空间,即给组件的最小高度或宽度添加多大的空间
	 * @param ipadx 横向填充
	 * @param ipady 纵向填充
	 * @return 当前对象
	 */
	public GBC setIpad(int ipadx, int ipady) {
		this.ipadx = ipadx;
		this.ipady = ipady;
		return this;
	}
}

  

时间: 2024-11-01 00:09:55

使用GridBagLayout实现的计算器UI的相关文章

[转]Android UI 自动化测试

介绍 Android测试支持库包含UI自动化模块,它可以对Android应用进行自动黑盒测试.在API Level 18中引入了自动化模块,它允许开发者在组成应用UI的控件上模仿用户行为. 在这个教程中,我将展示如何使用此模块来创建和执行一个基本的UI测试,选择默认的计算器模块进行测试. 先决条件 在使用前,需要具备以下条件: 最新版本的Android Studio 运行Android 4.3或者更高版本的设备或者虚拟器 理解JUnit 1. 安装依赖库 工程中使用UI自动化模块,需要编辑你的工

Android基础UI篇------六种基本布局

1.线性布局 LinearLayout 常用属性: android:gravity 设置子控件的对齐方式 android:orientation 排列方式 (分为水平排列和垂直排列) android:layout_gravity 设置相对于父控件的对齐方式 android:layout_weight 子控件在布局中所占的权重 !LinearLayout不会换行,所以,如果子控件超出屏幕范围,将不会显示. 2.表格布局 TableLayout 继承自LinearLayout,所以,它的本质依然是线

Android计算器Calculator2的移植

将Android 4.4.4的计算器Calculator移植出来,可以独立的在Android Studio中使用.完整的代码已经推到我的GitHub,链接在文末. 下面看一下效果图: 这是在三星手机上的效果,和我之前在Nexus上用的计算器UI一样,原生的.当然有了源码,我们就可以定制自己想要的效果了. 代码我就不贴了,可以去我的GitHub查看: 转载请注明出处:周木水的CSDN博客 http://blog.csdn.net/zhoumushui 我的GitHub:周木水的GitHub htt

Android Calculator2源码分析与修改

将Android 4.4.4的计算器Calculator移植出来,可以独立的在Android Studio中使用.完整的代码已经推到我的GitHub,链接在文末. 下面看一下效果图: 这是在三星手机上的效果,和我之前在Nexus上用的计算器UI一样,原生的.当然有了源码,我们就可以定制自己想要的效果了. 代码可以去我的GitHub查看. 在Dialer和Calculator中加入暗码启动指定应用 比如在拨号面板中输入##55555##启动没有图标的应用,其包名和类名是com.zms.test/.

Swing-布局管理器应用--WIN7上计算器的UI实现

学完了Swing布局管理器,为了加深理解我决定做一些UI的实现,那就从WIN7上的计算器开始吧!首先,我们来研究一下它的UI.该计算机的UI主要有3个,分别是标准型.科学型和程序员型,如下图所示.    标准型UI   科学型UI   程序员型UI 首先分析标准型UI: 标准型UI分析 该UI除菜单栏外,分两部分.考虑到它们在不同的UI中都会复用,我们将其分别使用screenPanel和standardPanel来进行实现.screenPanel没什么好说的,使用一个按钮独占整个面板,并设置按钮

UI基础之减法计算器

今天学习了一个ios应用的小实例,也是首次接触UI界面.下面大体介绍一下,这个减法计算器,只是单纯的为了演示UI界面的搭建和入门,没有任何的实用性.主要用到的知识点有: storyboard中添加空间 UIviewController和UIView的关系 程序的运行过程 IBAction和IBOutlet 监听控件的点击事件 父控件和子控件的概念 退出键盘 UI界面如上,整个界面上有1个按钮,3个文本标签,2个文本输入框. 经过分析可知,开发步骤基本可以分为两步: 添加需要的控件,搭建UI界面

IOS 开发笔记-基础 UI(1)-简单的计算器

(1)UI是App的根基:一个App应该是先有UI界面,然后在UI的基础上增加实用功能 (2)UI相对简单易学:UI普遍是学习过程中最简单的一块,能快速拥有成就感和学习兴趣 (3)UI至关重要:开发中的绝大部分时间都在处理UI 谨记一条IOS软件开发定律:万物皆对象,UI界面上的每一个元素都是一个对象 IOS,android 软件开发过程 UIKit框架是跟UI有关系的,标签,文本,按钮,进度条,开关等控件,都是封装在UIKit框架内部的,UIKit框架中提供了丰富多彩的可视化组件元素,利用UI

Python: UI编程之计算器

起源: 研究Python UI编程,我偏喜欢其原生组件,于是学习Tkinter.ttk组件用法.找一计算器开源代码,略加修整,以为备忘.其界面如图所示: 1.源代码(Python 2.7): # encoding: UTF-8 from Tkinter import * from ttk import * calc = Tk() calc.title('计算器') calc.resizable(False, False) buttons = [ '7', '8', '9', '*', 'C',

OC中使用UI自定义控件实现计算器的设计(版本1简单的加减乘除,连加,连减,连除,连乘)

OC中使用UI自定义控件实现计算器的设计(版本1简单的加减乘除,连加,连减,连除,连乘) #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UIApplicationDelegate> { float _operator1; float _operator2; float _result; } @end #import "ViewController.h" @interfac