JAVA自学日记——Part Ⅲ
终于来到了可视化窗口制作的部分了,从学习JAVA之前,到开始入手学习,一直到现在,都在盼望着有一天可以自己写出一款有界面而且是很美观的应用程序,今天算是一个真正开始的时间节点,值得纪念。
内容有很多,首先是Swing和抽象窗口工具包:Swing提供了编写使用图形用户界面的程序所需的一切,是现在应用最广泛的一种GUI。
组件图形用户界面时,需要使用两类对象:组件和容器。组件是用户界面中的独立元素,如按钮或者滑块;容器是用于容纳其它组件的组件。
我们所需的容器和组件基本全都在javax.swing.*与java.awt.*包中。
1.设置框架标题。
在继承JFrame的类中,可以调用JFrame的构造函数来设置标题:
super("Title");
也可以使用框架的方法:
setTitle("Title");
2.指定框架的大小
setSize(350,125); //数字代表框架的高度宽度,以像素为单位
3.关闭框架的方法
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //按钮被单击时退出程序
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //关闭框架并销毁对象,但应用程序继续运行
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); //让框架打开并继续运行
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); //关闭框架并继续运行
4.外观自定义
通过调用主Swing包中UIManager类的setLookAndFeel()方法可以设置外观。该方法接收一个参数:外观类的完整名称。(在调用方法是使用try-catch来处理可能发生的错误)
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); //表示调用了Nimbus这个外观
5.显示框架
setVisible(true);
6.按钮(JButton)
JButton okButton=new JButton("OK"); //创建JButton对象并设置标签
add(okButton); //将JButton组件添加到容器中
7.布局管理器
布局管理器可以来设置组件在容器中的位置,目前有以下几种布局管理器
FlowLayout:最简单的布局管理器
FlowLayout flo=new FlowLayout();
GridLayout:可将组件组织委员指定的行数和列数
GridLayout grid=new GridLayout(2,3); //组织为2行3列
BorderLayout:将组件放置在东西南北中五个防线
BorderLayout border=new BorderLayout();
add(aButton,BorderLayout.NORTH);
add(bButton,BorderLayout.SOUTH);
add(cButton,BorderLayout.EAST);
add(dButton,BorderLayout.WEST);
add(eButton,BorderLayout.CENTER);
BoxLayout:将组件排成一行或者一列
BoxLayout.X_AXIS指定水平排列,BoxLayout.Y_AXIS指定垂直排列
JPanel swingDemo=new JPanel();
BoxLayout box=new BoxLayout(swingDemo,BoxLayout.X_AXIS); //将面板swingDemo组件水平排列
8.标签和文本框(JLable、JTextField)
JLable用来显示用户不可修改的信息,可以使文本也可以是图形。
JLable page1=new JLable("Email Adress:",JLable.RIGHT); //RIGHT表示右对齐
JTextField用来提供用户输入单行文本的区域,创建文本框时,可以设置其宽度
JTextField pageAddress=new JTextField("US",20); //默认内容为“US”,宽度为20字符
对象包含的文本可使用方法getText()来检索
String email=Email.getText();
设置文本
Email.setText("21312151252@163.com");
9.复选框(JCheckBox)
由文件和方框组成,可选中。
JCheckBox box=new JCheckBox("Hello World"); //为复选框设置标签“Hello World”
JCheckBox可以编成组,但是不能同时被选中。
使用以上代码进行测试
由于jumbo size不在ButtonGroup内,所以不受其他三个选项的影响。
10.组合框(JComboBox)
弹出式选择列表,也可以设置成能够接受文本输入。
11.文本区域(JTextArea)
允许用户输入多行文本,可以指定组件的宽度和高度。
文本区域组件的实际效果会有所不同:达到底部时,会自动增大,没有滚动条,相对来讲比较简陋。需要放入以后学习到的滚动窗格的容器中
12.面板(JPanel)
JPanel是在Swing中可以使用的最简单的容器
13.使用Insets将组件隔开
使用Insets令组件远离容器边缘,Insets是代表容器边缘区域的对象。
Insets around=new Insets(10,6,10,3); //上边缘内10像素,左6,右3,下10
综合今天的学习,设计出了一个完整的界面,供以后的学习使用:
package com.LottoMadness.GUI; import javax.swing.*; import java.awt.*; public class LottoMadness extends JFrame { //set up row1 JPanel row1=new JPanel(); ButtonGroup option=new ButtonGroup(); JCheckBox quickpick=new JCheckBox("Qucik Pick",false); JCheckBox personal=new JCheckBox("Peronal",true); //set up row2 JPanel row2=new JPanel(); JLabel numbersLabel=new JLabel("Your Picks: ",JLabel.RIGHT); JTextField[] numbers=new JTextField[6]; JLabel winnersLabel=new JLabel("Winners:",JLabel.RIGHT); JTextField[] winners=new JTextField[6]; //set up row3 JPanel row3=new JPanel(); JButton stop=new JButton("Stop"); JButton play=new JButton("Play"); JButton reset=new JButton("Reset"); //set up row4 JPanel row4=new JPanel(); JLabel got3Label=new JLabel("3 of 6:",JLabel.RIGHT); JTextField got3=new JTextField("0"); JLabel got4Label=new JLabel("4 of 6:",JLabel.RIGHT); JTextField got4=new JTextField("0"); JLabel got5Label=new JLabel("5 of 6:",JLabel.RIGHT); JTextField got5=new JTextField("0"); JLabel got6Label=new JLabel("6 of 6:",JLabel.RIGHT); JTextField got6=new JTextField("0",10); JLabel drawingsLabel=new JLabel("Drawings:",JLabel.RIGHT); JTextField drawings=new JTextField("0"); JLabel yearsLabel=new JLabel("Years:",JLabel.RIGHT); JTextField years=new JTextField(); public LottoMadness(){ super("Lotto Madness"); setLookAndFeel(); setSize(550,400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); GridLayout layout=new GridLayout(5,1,10,10); setLayout(layout); FlowLayout layout1=new FlowLayout(FlowLayout.CENTER,10,10); option.add(quickpick); option.add(personal); row1.setLayout(layout1); row1.add(quickpick); row1.add(personal); add(row1); GridLayout layout2=new GridLayout(2, 7,10,10); row2.setLayout(layout2); row2.add(numbersLabel); for(int i=0;i<6;i++){ numbers[i]=new JTextField(); row2.add(numbers[i]); } row2.add(winnersLabel); for(int i=0;i<6;i++){ winners[i]=new JTextField(); winners[i].setEditable(false); row2.add(winners[i]); } add(row2); FlowLayout layout3=new FlowLayout(FlowLayout.CENTER,10,10); row3.setLayout(layout3); stop.setEnabled(false); row3.add(stop); row3.add(play); row3.add(reset); add(row3); GridLayout layout4=new GridLayout(2, 3,20,10); row4.setLayout(layout4); row4.add(got3Label); got3.setEditable(false); row4.add(got3); row4.add(got4Label); got4.setEditable(false); row4.add(got4); row4.add(got5Label); got5.setEditable(false); row4.add(got5); row4.add(got6Label); got6.setEditable(false); row4.add(got6); row4.add(drawingsLabel); drawings.setEditable(false); row4.add(drawings); row4.add(yearsLabel); years.setEditable(false); row4.add(years); add(row4); setVisible(true); } private void setLookAndFeel() { try{ UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); }catch(Exception exc){ //ignore error } } public static void main(String args[]){ LottoMadness frame=new LottoMadness(); } }