`

Swing界面布局之代码手写一, 计算器layout实现

 
阅读更多

很多人认为Swing的布局设计很难, 其实并不然
一方面是教科书的误导
另一方面是Swing的布局思想比较先进, 理解了, 你就会喜欢上它

这篇贴子, 先讲简单的, 也是许多人学习swing时最想做的事, 我希望像VS一样设计Layout
要在Swing里实现这个, 其实很简单, 只须要轻轻地告诉swing, 我的layout为null即可
可惜, 读了好多本swing的书, 都没有比较仔细的例子, 只有简单地说一下(一小段文字)

下面是用swing做的一个计算器demo, 只有layout, 没有功能实现




既然是手写代码, 当然是简洁喽, 不像IDE生成的一大堆不明所以的代码

Java代码 复制代码 收藏代码
  1. public CalculatorView() {   
  2.     frame=new JFrame("计算器");   
  3.     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       //退出窗口时关闭线程   
  4.     frame.setBounds(200200300250);                //初始位置和大小   
  5.     frame.setResizable(false);                  //不能放大   
  6.     container=frame.getContentPane();               //指定container   
  7.     container.setLayout(null);                  //像VS一样的布局,简单实现   
  8.     setLookAndFeel();                       //XP style的layout   
  9.     addComponent();                         //添加控件   
  10.     frame.setVisible(true);                     //最后把窗口显示出来   
  11. }  
	public CalculatorView() {
		frame=new JFrame("计算器");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		//退出窗口时关闭线程
		frame.setBounds(200, 200, 300, 250);				//初始位置和大小
		frame.setResizable(false);					//不能放大
		container=frame.getContentPane();				//指定container
		container.setLayout(null);					//像VS一样的布局,简单实现
		setLookAndFeel();						//XP style的layout
		addComponent();							//添加控件
		frame.setVisible(true);						//最后把窗口显示出来
	}



添加控件: 菜单, 结果文本框, 按钮

Java代码 复制代码 收藏代码
  1. void addComponent(){   
  2.     addMenu();                      //添加菜单栏   
  3.     addResultText();                    //添加结果显示文本框   
  4.     addButtonGroup();                   //添加按钮   
  5.   
  6.     container.setBackground(new Color(236,233,216));    //调整面板颜色一致   
  7.     JSeparator sep1=new JSeparator();           //菜单栏下面的分隔线   
  8.     sep1.setBounds(0303001);   
  9.     sep1.setForeground(Color.WHITE);   
  10.     container.add(sep1);   
  11. }  
	void addComponent(){
		addMenu();						//添加菜单栏
		addResultText();					//添加结果显示文本框
		addButtonGroup();					//添加按钮

		container.setBackground(new Color(236,233,216));	//调整面板颜色一致
		JSeparator sep1=new JSeparator();			//菜单栏下面的分隔线
		sep1.setBounds(0, 30, 300, 1);
		sep1.setForeground(Color.WHITE);
		container.add(sep1);
	}



菜单和结果文本框比较简单, 不贴上来, 下面的按钮的

Java代码 复制代码 收藏代码
  1. void addButtonGroup(){   
  2.     JPanel panBtn=new JPanel(null);         //所有的按钮都加在这个panel里   
  3.     panBtn.setBounds(065300200);   
  4.     JButton btnBS=new JButton("Backspace");     //backspace,CE,C三个按钮单独添加   
  5.     btnBS.setBounds(6058025);   
  6.     panBtn.add(btnBS);              //new BtnUI()   
  7.     btnBS.setUI(new BtnUI());           //由于swing的文字渲染要求按钮   
  8.     JButton btnCE=new JButton("CE");        //要很多的横向空间, 所以只好   
  9.     btnCE.setBounds(15056025);        //自己override文字渲染function   
  10.     panBtn.add(btnCE);   
  11.     JButton btnC=new JButton("C");   
  12.     btnC.setBounds(22056025);   
  13.     panBtn.add(btnC);   
  14.        
  15.     String[] btnName={   
  16.         "MC""7""8""9""/""sqrt"  
  17.         ,"MR""4""5""6""*""%"  
  18.         ,"MS""1""2""3""-""1/x"  
  19.         ,"M+""0""+/-"".""+""="  
  20.     };   
  21.     JButton[] btns=new JButton[24];   
  22.     int i=0;   
  23.     int oriX=15;   
  24.     int oriY=35;   
  25.     int btnW=40;   
  26.     int btnH=25;   
  27.     for(JButton btn : btns){   
  28.         btn=new JButton();   
  29.         btns[i]=btn;   
  30.         int x=(i%6)*(btnW+5)+oriX;   
  31.         int y=(i/6)*(btnH+5)+oriY;   
  32.         x=(i%6==0)?x-10:x;      //add sep sapce more   
  33.         btn.setText(btnName[i++]);   
  34.         btn.setUI(new BtnUI());   
  35.         btn.setForeground(Color.blue);   
  36.         btn.setBounds(x, y, btnW, btnH);   
  37.         panBtn.add(btn);   
  38.     }   
  39.     //set some button color to red   
  40.     int red[]={061218410162223};   
  41.     for(int n : red){   
  42.         btns[n].setForeground(Color.RED);   
  43.     }   
  44.     btnBS.setForeground(Color.RED);   
  45.     btnCE.setForeground(Color.RED);   
  46.     btnC.setForeground(Color.RED);   
  47.     container.add(panBtn);                  //panel加进container容器里   
  48. }  
	void addButtonGroup(){
		JPanel panBtn=new JPanel(null);			//所有的按钮都加在这个panel里
		panBtn.setBounds(0, 65, 300, 200);
		JButton btnBS=new JButton("Backspace");		//backspace,CE,C三个按钮单独添加
		btnBS.setBounds(60, 5, 80, 25);
		panBtn.add(btnBS);				//new BtnUI()
		btnBS.setUI(new BtnUI());			//由于swing的文字渲染要求按钮
		JButton btnCE=new JButton("CE");		//要很多的横向空间, 所以只好
		btnCE.setBounds(150, 5, 60, 25);		//自己override文字渲染function
		panBtn.add(btnCE);
		JButton btnC=new JButton("C");
		btnC.setBounds(220, 5, 60, 25);
		panBtn.add(btnC);
		
		String[] btnName={
			"MC", "7", "8", "9", "/", "sqrt"
			,"MR", "4", "5", "6", "*", "%"
			,"MS", "1", "2", "3", "-", "1/x"
			,"M+", "0", "+/-", ".", "+", "="
		};
		JButton[] btns=new JButton[24];
		int i=0;
		int oriX=15;
		int oriY=35;
		int btnW=40;
		int btnH=25;
		for(JButton btn : btns){
			btn=new JButton();
			btns[i]=btn;
			int x=(i%6)*(btnW+5)+oriX;
			int y=(i/6)*(btnH+5)+oriY;
			x=(i%6==0)?x-10:x;		//add sep sapce more
			btn.setText(btnName[i++]);
			btn.setUI(new BtnUI());
			btn.setForeground(Color.blue);
			btn.setBounds(x, y, btnW, btnH);
			panBtn.add(btn);
		}
		//set some button color to red
		int red[]={0, 6, 12, 18, 4, 10, 16, 22, 23};
		for(int n : red){
			btns[n].setForeground(Color.RED);
		}
		btnBS.setForeground(Color.RED);
		btnCE.setForeground(Color.RED);
		btnC.setForeground(Color.RED);
		container.add(panBtn);					//panel加进container容器里
	}



BtnUI(),
由于swing的文字渲染要求按钮, 要很多的横向空间, 所以只好自己override文字渲染function

Java代码 复制代码 收藏代码
  1. class BtnUI extends WindowsButtonUI {   
  2.   
  3.         @Override  
  4.         protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, String text) {   
  5.             textRect.width=40;   
  6.             text=b.getText();   
  7. //          FontMetrics fm=SwingUtilities2.getFontMetrics(b, g);        //source code method   
  8.             FontMetrics fm=Toolkit.getDefaultToolkit().getFontMetrics(b.getFont());   
  9.             int w=fm.stringWidth(text);   
  10.             int x=(b.getWidth()-w)/2;   
  11.             int y=17;   
  12.             g.setColor(b.getForeground());   
  13. //          SwingUtilities2.drawString(b, g, text, x, y);               //source code method   
  14.             g.drawString(text, x, y);   
  15.         }   
  16.     }  
class BtnUI extends WindowsButtonUI {

		@Override
		protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, String text) {
			textRect.width=40;
			text=b.getText();
//			FontMetrics fm=SwingUtilities2.getFontMetrics(b, g);		//source code method
			FontMetrics fm=Toolkit.getDefaultToolkit().getFontMetrics(b.getFont());
			int w=fm.stringWidth(text);
			int x=(b.getWidth()-w)/2;
			int y=17;
			g.setColor(b.getForeground());
//			SwingUtilities2.drawString(b, g, text, x, y);				//source code method
			g.drawString(text, x, y);
		}
	}



以上, 只有178行, 够简洁吧, 其实主要不是在乎行数的多少, 而是受不了IDE生成的一大堆代码
而且, 自己写, 结构能控制得更好

  • 大小: 78.4 KB
分享到:
评论

相关推荐

    Swing版简单计算器

    Swing版的简单计算器,实现加减乘除,第一次写,希望大家给点建议。

    Java swing编写的计算器界面.zip

    本压缩包"Java swing编写的计算器界面.zip"包含了用Java Swing实现的计算器的源代码示例,以及相关文档,帮助开发者理解如何利用Swing构建这样的应用。 首先,让我们深入了解一下Java Swing。Swing是基于Java AWT...

    JavaSwing实现简单计算器

    本项目"JavaSwing实现简单计算器"就是利用这些组件来创建一个功能基础的计算器应用,可以处理基本的数学运算,包括加、减、乘、除,同时也支持负数、小数以及括号的使用。下面我们将详细探讨实现这样一个计算器所需...

    基于Java swing组件实现简易计算器

    "基于Java swing组件实现简易计算器...本文主要介绍了基于Java swing组件实现简易计算器的知识点,包括JFrame、JButton、JPanel、JTextArea、GridLayout等组件的使用, serta事件处理、布局管理器、代码优化等知识点。

    swing计算器,swing计算器 swing计算器

    本项目的核心在于利用Swing组件来创建一个功能齐全的计算器界面,并实现基本的数学运算。 在Swing计算器中,开发者会使用诸如JButton、JFrame、JPanel等Swing组件来构建计算器的外观。JFrame作为主窗口,承载着整个...

    简单的计算器(java.swing界面实现)

    在本项目中,我们讨论的是一个基于Java Swing库构建的简单计算器应用。这个计算器能够执行基本的算术运算,如加、减、乘、除,还包括开方、求模和求倒数等进阶功能。以下是对这个项目的详细分析: **Java Swing库...

    Swing实现一个简单的计算器

    这个示例展示了如何使用 Swing 来实现一个简单的计算器。我们使用了多种 Swing 组件、布局管理器和事件监听来实现这个示例。这个示例展示了 Swing 的一些优点,例如易于使用的组件和灵活的布局管理。

    Java计算器源代码 awt+swing图形界面

    Java 计算器源代码 awt+swing 图形界面是一款使用 Java 语言开发的图形化计算器应用程序,采用了 AWT 和 Swing 库来实现图形用户界面。下面是该计算器的主要知识点: 1. AWT 和 Swing 库:AWT(Abstract Window ...

    swing-layout-1.0.3

    swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3...

    利用网格布局写的一个java计算器

    本项目利用Java的Swing库,通过网格布局(Grid Layout)设计了一个简单的计算器。Swing是Java标准版(Java SE)的一部分,提供了丰富的组件库来构建图形用户界面。网格布局是一种将容器划分为等大小网格的布局管理器...

    java中关于swing的应用实例(计算器界面)

    在"java中关于swing的应用实例(计算器界面)"这个项目中,我们很可能会看到如何使用Swing组件来创建一个类似实际计算器的布局和功能。 首先,我们会使用JFrame作为主窗口,它是所有Swing应用程序的基础。然后,...

    简单计算器的实现源代码

    这个简单的计算器程序是用Java语言编写的,基于Swing库构建GUI(图形用户界面)。首先,我们来看一下主要的类`Calculator1`,它继承自`JFrame`,并且实现了`ActionListener`接口,这意味着它能够处理按钮点击事件。 ...

    Java的Swing组件实现的计算器,Java入门学习案例,源码.rar

    这个“Java的Swing组件实现的计算器”是一个典型的Java初学者项目,用于帮助开发者了解如何使用Swing来构建桌面应用程序。下面将详细阐述Swing组件以及在创建计算器应用中的关键知识点。 首先,Swing提供了丰富的...

    j2se实现计算器,界面优美

    总结一下,这个J2SE计算器项目是Java Swing GUI编程的一个示例,展示了如何创建一个具有美观界面的计算工具。通过学习这个项目,初学者可以了解如何设计GUI,处理事件,以及实现基本的数学运算。同时,项目的源代码...

    java swing 实现计算器源码

    在这个"java swing 实现计算器源码"项目中,开发者使用Swing构建了一个计算器应用程序,尽管未经过全面测试,但理论上应该能够正常运行。 Swing 提供了一系列的组件,如 JButton、JLabel、JTextField 等,这些组件...

    java实现的计算器(界面程序)

    本项目名为“java实现的计算器(界面程序)”,使用了Java Swing库来构建计算器的界面,并采用了GridBagLayout布局管理器来优化组件的摆放,以实现一个美观且功能齐全的计算器。 Java Swing是Java AWT(抽象窗口...

    TDD之Swing一个另类的计算器实现心得

    标题中的"TDD之Swing一个另类的计算器实现心得"表明了这篇博文是关于使用测试驱动开发(Test-Driven Development, TDD)方法来构建一个基于Java Swing的计算器应用的心得体会。在TDD中,开发者先编写测试用例,然后...

    java swing界面做的计算器

    用java swing界面做的计算器,能连续加减乘除,功能基本到位

    java Swing实现计算器源码

    java Swing实现计算器源码

    java中Swing做的简单计算器

    优化通常包括减少代码重复,使用更高效的数据结构或算法,或者利用Swing的高级特性,如布局管理器(Layout Manager)。例如,开发者可能使用GridLayout来更简洁地排列按钮,而不是手动设置每个组件的位置。此外,...

Global site tag (gtag.js) - Google Analytics