常用布局
1)、流布局:
FlowLayout 从左到右,自上而下方式在容器中排列,控件的大小不会随容器大小变化.
容器.setLayout(new FlowLayout(FlowLayout.LEFT));
2)、网格布局:
GridLayout 按照指定行数与列数,将容器分成大小相等的单元格每个单元格放置一个控件. 不能将控件放在指定单元格
容器.setLayout(new GridLayout(3,4,10,15));
3)、边界布局:
BorderLayout 将容器分成东、西、南、北、中五个部分
容器.setLayout(new BorderLayout());
窗口的内容面板默认布局就是边界布局。
容器.add(控件,BorderLayout.NORTH);
4)、混合布局:
使用JPanel,将多个布局组合在一起使用
5)、绝对布局 null:
以坐标定位
容器.setLayout(null);
每个控件在放置在容器之前,必须设置其边界 setBounds(x,y,width,height);
btn.setBounds(10,100,30,60);
常用事件
1)、事件源 EventSource:能够触发事件控件 如:JButton,JTextField,JFrame,JComboBox,....
2)、事件 Event:ActionEvent,KeyEvent,WindowEvent,TextEvent,...
3)、事件侦听者Listener(接口) ActionListener,WindowListener,...
class A implements ActionListener{
public void actionPerformed(ActionEvent e){
....
}
}
A lis=new A();
4)、事件处理函数
public void actionPerformed(ActionEvent e){
....
}
事件流程:事件源触发事件-->事件源侦听者接收事件-->自动调用相应事件处理函数.
实践编程
1.在应用程序窗体中安排1个文本框,一个标签。在文本框输入一个数字(0-9),按回车键,在标签处显示对应的英文单词。 0---zero,1---one,....
窗体类:
package 简单数字对应窗体; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Numcompare extends JFrame{ JTextField text; JLabel label; Numcompare(){ setTitle("Number change"); //限制输入一个数字 text=new JTextField(10); label=new JLabel(); label.setText("请输入0-9的数字"); text.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String getstr=text.getText(); String showstr=null; switch (getstr) { case "0": showstr="zero"; break; case "1": showstr="one"; break; case "2": showstr="two"; break; case "3": showstr="three"; break; case "4": showstr="four"; break; case "5": showstr="five"; break; case "6": showstr="six"; break; case "7": showstr="seven"; break; case "8": showstr="eight"; break; case "9": showstr="nine"; break; default: showstr=("请输入0-9的数字"); break; } label.setText(showstr); text.setText(null); } }); setLayout(new FlowLayout()); add(text); add(label); setBounds(100,100,460,190); setVisible(true); validate(); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);; } }
实现类(注:以下省略实现类--实例化自定义窗体)
package 简单数字对应窗体; public class test { public static void main(String[] args) { new Numcompare(); } }
结果:
2.在应用程序窗体中安排两个文本框分别用来输入两个整数,两个按钮分别为 “+”,“*”,一个结果标签。点击按纽“+”将两文本框的数据做加法运算;点击按钮“*”做乘法运算,将结果显示在标签中。
窗体类:
package 简单计算窗体; import java.awt.event.*; import java.math.BigInteger; import java.awt.*; import javax.swing.*; public class Caculate extends JFrame{ JTextArea text1,text2; JButton jb1,jb2; JLabel label; Caculate(){ text1=new JTextArea(2,4); text2=new JTextArea(2,4); jb1=new JButton("+"); jb2=new JButton("*"); label=new JLabel(); JSplitPane p1; JPanel p2=new JPanel(); jb1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String n1=text1.getText(); String n2=text2.getText(); try { BigInteger num1=new BigInteger(n1); BigInteger num2=new BigInteger(n2); label.setText((num1.add(num2)).toString()); }catch (Exception ee) { label.setText("请输入整数"); text1.setText(null); text2.setText(null); } } }); jb2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String n1=text1.getText(); String n2=text2.getText(); try { BigInteger num1=new BigInteger(n1); BigInteger num2=new BigInteger(n2); label.setText((num1.multiply(num2)).toString()); }catch (Exception ee) { label.setText("请输入整数"); text1.setText(null); text2.setText(null); } } }); setLayout(new GridLayout(3,1)); p1=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,text1,text2); p1.setDividerLocation(117); add(p1); p2.setLayout(new GridLayout(1,2)); p2.add(jb1); p2.add(jb2); add(p2); add(label); setBounds(100,100,260,190); setVisible(true); validate(); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } }
结果:
3.设计合理的布局生成下图所示的图形界面,并编写事件处理程序实现以下功能:按“产生”按钮,产生两个随机数并分别显示在“数字一”和“数字二”对应的文本框内,按“计算”按钮,计算产生的这两个随机数之和,并显示在“结果”对应的文本框内。
窗体类
package 随机数和; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.math.BigDecimal; import javax.swing.*; public class RandomAdd extends JFrame{ JLabel label1=new JLabel("数字一"); JLabel label2=new JLabel("数字二"); JLabel label3=new JLabel("结果"); JButton jb1=new JButton("产生"); JButton jb2=new JButton("计算"); RandomAdd(){ setTitle("随机生成数 相加计算"); JTextArea ja1=new JTextArea(2,4); JTextArea ja2=new JTextArea(2,4); JTextArea ja3=new JTextArea(2,4); Box basebox,box1,box2; jb1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ja1.setText(Math.random()*100+""); ja2.setText(Math.random()*100+""); ja3.setText(null); } }); jb2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { BigDecimal num1 = new BigDecimal(ja1.getText()); BigDecimal num2 = new BigDecimal(ja2.getText()); ja3.setText(num1.add(num2).toString()); }catch (Exception ee) { ja3.setText("请点击产生键"); } } }); box1=Box.createVerticalBox(); box1.add(label1); box1.add(Box.createHorizontalStrut(8)); box1.add(label2); box1.add(Box.createHorizontalStrut(8)); box1.add(label3); box1.add(Box.createHorizontalStrut(8)); box2=Box.createVerticalBox(); box2.add(ja1); box2.add(Box.createHorizontalStrut(8)); box2.add(ja2); box2.add(Box.createHorizontalStrut(8)); box2.add(ja3); box2.add(Box.createHorizontalStrut(8)); basebox=Box.createHorizontalBox(); basebox.add(box1); basebox.add(Box.createHorizontalStrut(80)); basebox.add(box2); setLayout(new GridLayout(2,1)); JPanel jp=new JPanel(); add(basebox); jp.add(jb1); jp.add(jb2); add(jp); setBounds(100,100,260,190); setVisible(true); validate(); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } }
结果
4、编写程序实现如下界面,实现事件如果按下座位i 就在控制台中显示“座位i被选中” 例如按下 “座位0“,则输出座位0被选中”。
窗体类
package 选座位; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.*; import javax.swing.*; public class ChooseChair extends JFrame implements ActionListener{ ChooseChair(){ JButton jb0=new JButton("座位0"); JButton jb1=new JButton("座位1"); JButton jb2=new JButton("座位2"); JButton jb3=new JButton("座位3"); JButton jb4=new JButton("座位4"); JButton jb5=new JButton("座位5"); jb0.addActionListener(this); jb1.addActionListener(this); jb2.addActionListener(this); jb3.addActionListener(this); jb4.addActionListener(this); jb5.addActionListener(this); JLabel label=new JLabel("讲台",JLabel.CENTER); JPanel jp=new JPanel(); jp.setLayout(new GridLayout(2,3)); jp.add(jb0); jp.add(jb1); jp.add(jb2); jp.add(jb3); jp.add(jb4); jp.add(jb5); add(jp,BorderLayout.CENTER); add(label,BorderLayout.NORTH); setBounds(100,100,260,190); setVisible(true); validate(); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } @Override public void actionPerformed(ActionEvent e) { System.out.println(e.getActionCommand()+"被选中"); } }
结果:
5、完成以下窗体制作
窗体类
package 图书馆办证; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; public class LibraryRegister extends JFrame{ LibraryRegister(){ setTitle("图书馆办理"); JLabel label0=new JLabel("图书证注册"); JLabel label1=new JLabel("姓名:"); JLabel label2=new JLabel("性别:"); JLabel label3=new JLabel("身份:"); JLabel label4=new JLabel("单位:"); JLabel label5=new JLabel("证件号码:"); JLabel label6=new JLabel("注册日期:"); JLabel label7=new JLabel("有效日期:"); JTextField ja1=new JTextField(); JTextArea ja2=new JTextArea(1,1); JTextArea ja3=new JTextArea(1,1); JTextArea ja4=new JTextArea(1,1); JComboBox jm1=new JComboBox(); JComboBox jm2=new JComboBox(); JComboBox jm3=new JComboBox(); jm1.addItem("男"); jm1.addItem("女"); jm2.addItem("学生"); jm2.addItem("老师"); jm3.addItem("计算机系"); jm3.addItem("英语系"); jm3.addItem("国交系"); JPanel jp1=new JPanel(); JPanel jp2=new JPanel(); JButton jb1=new JButton("添加"); JButton jb2=new JButton("删除"); JButton jb3=new JButton("撤销"); JButton jb4=new JButton("退出"); Box basebox,box1,box2; //上部 jp1.add(label0); //中部 box1=Box.createVerticalBox(); box1.add(label1); box1.add(Box.createVerticalStrut(15)); box1.add(label2); box1.add(Box.createVerticalStrut(15)); box1.add(label3); box1.add(Box.createVerticalStrut(15)); box1.add(label4); box1.add(Box.createVerticalStrut(15)); box1.add(label5); box1.add(Box.createVerticalStrut(15)); box1.add(label6); box1.add(Box.createVerticalStrut(15)); box1.add(label7); box2=Box.createVerticalBox(); box2.add(ja1); box2.add(Box.createVerticalStrut(8)); box2.add(jm1); box2.add(Box.createVerticalStrut(8)); box2.add(jm2); box2.add(Box.createVerticalStrut(8)); box2.add(jm3); box2.add(Box.createVerticalStrut(8)); box2.add(ja2); box2.add(Box.createVerticalStrut(8)); box2.add(ja3); box2.add(Box.createVerticalStrut(8)); box2.add(ja4); basebox=Box.createHorizontalBox(); basebox.add(box1); basebox.add(Box.createHorizontalStrut(200)); basebox.add(box2); //底部按钮 懒得实现 jp2.add(jb1); jp2.add(jb2); jp2.add(jb3); jp2.add(jb4); setLayout(new BorderLayout()); add(jp1,BorderLayout.NORTH); add(basebox); add(jp2,BorderLayout.SOUTH); setBounds(100,100,500,325); setVisible(true); validate(); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } }
结果
6、运用Swing控件完成下题
package 借用物品; 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; public class BorrowItem extends JFrame{ BorrowItem(){ setTitle("借用物品"); JLabel label1=new JLabel("员工编号:"); JLabel label2=new JLabel("借用器具:"); JLabel label3=new JLabel("借用日期:"); JLabel label4=new JLabel("归还日期:"); JLabel label5=new JLabel("借用原因:"); JTextField text1=new JTextField(9); JTextField text2=new JTextField(9); JTextField text3=new JTextField(9); JTextField text4=new JTextField(9); JTextField text5=new JTextField(25); JButton jb1=new JButton("确定"); JButton jb2=new JButton("取消"); Dimension preferredSize = new Dimension(160,30);//设置尺寸 jb1.setPreferredSize(preferredSize ); jb2.setPreferredSize(preferredSize ); setLayout(new GridLayout(4,1)); JPanel jp1=new JPanel(); JPanel jp2=new JPanel(); JPanel jp3=new JPanel(); JPanel jp4=new JPanel(); jp1.add(label1); jp1.add(text1); jp1.add(label2); jp1.add(text2); jp2.add(label3); jp2.add(text3); jp2.add(label4); jp2.add(text4); jp3.add(label5); jp3.add(text5); jp4.add(jb1); jp4.add(jb2); add(jp1); add(jp2); add(jp3); add(jp4); setBounds(100,100,350,180); setVisible(true); validate(); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } }
结果