java入门09Swing编程(10学时)_第1页
java入门09Swing编程(10学时)_第2页
java入门09Swing编程(10学时)_第3页
java入门09Swing编程(10学时)_第4页
java入门09Swing编程(10学时)_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主讲教师张智计算机学院网络工程系9Swing编程9.1JFrame框架9.2布局管理器9.3常用组件9.1JFrame框架JFrame是一个顶层容器,主要用来设计应用程序的图形用户界面。JFrame支持多线程。创建过程New→Other→Swing→MatisseForm选择JFrame。publicclasshelloJFrame

extendsjavax.swing.JFrame{

publichelloJFrame(){initComponents();}

privatevoidinitComponents(){setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);javax.swing.GroupLayoutlayout=newjavax.swing.GroupLayout(getContentPane());getContentPane().setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0,400,Short.MAX_VALUE));layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0,300,Short.MAX_VALUE));pack();}publicstaticvoidmain(Stringargs[]){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){newhelloJFrame().setVisible(true);}});}}构造函数javax.swing.GroupLayoutlayout=newjavax.swing.GroupLayout(getContentPane());getContentPane().setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0,400,Short.MAX_VALUE));layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0,300,Short.MAX_VALUE));pack();布局管理启动多线程显示窗口继承JFramehelloJFrame.javaJFrame常用属性和方法注意:设置JFrame的背景颜色,仍然会被内容面板盖住,不如设置内容面板的背景颜色:getContentPane().setBackground(Color.Red);JFrame常用属性和方法(续)单独使用setSize()时,是按照设置的大小显示的;此时不能使用pack(),否则自动适配内容面板:JFrame一旦创建,在其中就已经包含一个内容面板,一般往JFrame中添加组件时,都加在内容面板中多窗口示例再新建一个JFrame(命名为JFrame2.java),设置在第一个JFrame中添加一个成员变量:privatenewJFrame=newJFrame2();在第一个JFrame中添加一个JButton,右击按钮添,加一个单击事件(Events→Action→actionPerformed方法)和代码:newJFrame.setTitle("第二个窗口");newJFrame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);newJFrame.setVisible(true);有关Java事件处理参考P214【Return】9.2布局管理器容器中可以容纳组件,在往容器中添加多个组件时,要考虑这些组件在容器中的布局。由于Java是跨平台语言,使用绝对坐标会导致问题:即在不同平台、不同分辨率下的显示效果不一样。为了实现跨平台的特性并且获得动态的布局效果,Java将容器内的所有组件安排给一个“布局管理器”负责管理。Java提供的布局管理器类BorderLayoutFlowLayoutGirdLayoutCardLayoutBoxLayoutGirdBagLayoutGroupLayout(MatisseForm默认)【Return】有关其他布局参考P219BorderLayout布局BorderLayout把容器空间划分为东、西、南、北、中5个区域。BorderLayout.EASTBorderLayout.WESTBorderLayout.SOUTHBorderLayout.NORTHBorderLayout.CENTERBorderLayout是顶层容器(JFrame/Jdialog/JApplet)

默认的布局管理器。BorderLayout布局用法示例BorderLayout构造函数:BorderLayout():创建一个组件之间没有水平和垂直间距的BorderLayout布局。BorderLayout(inthgap,intvgap):通过参数hgap和vgap分别设定组件的水平和垂直间距。JFrame使用setLayout(newBorderLayout())方法来创建布局管理器。当需要在使用BorderLayout布局的容器中添加组件时,可用add方法,例如:

add(组件,BorderLayout.EAST);//将组件放在东边testBorderLayout.javapackagetestSwing;importjava.awt.BorderLayout;importjavax.swing.*;publicclasstestBorderLayout

extendsJFrame{publictestBorderLayout(){//this.setLayout(newBorderLayout(5,5));设置组件间水平和垂直间距this.add(newJButton("东"),BorderLayout.EAST);this.add(newJButton("西"),BorderLayout.WEST);this.add(newJButton("南"),BorderLayout.SOUTH);this.add(newJButton("北"),BorderLayout.NORTH);this.add(newJButton("中"),BorderLayout.CENTER);}publicstaticvoidmain(String[]args){

testBorderLayoutframe=newtestBorderLayout();frame.setTitle("testBorderLayout");//设置标题frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口关闭操作//frame.setSize(300,400);//设置窗口的宽和高frame.setBounds(100,100,300,400);//设置窗口初始位置和宽高frame.setVisible(true);//显示窗口}}手工写的class不使用MatisseForm创建往容器中添加组件并配置布局【Return】FlowLayout布局FlowLayout布局管理器把容器看成一个行集,好象平时在一张纸上写字一样,一行写满就换下一行。默认情况下组件按添加的先后顺序从左至右摆放,如果一行排满,则在下一行中继续。默认情况下,容器中的每一行组件都居中对齐。FlowLayout布局示例FlowLayout构造函数:FlowLayout():创建一个默认FlowLayout布局。FlowLayout(intalign):align对齐方式:FlowLayout.LEFT/FlowLayout.CENTER/FlowLayout.RIGHT。FlowLayout(intalign,inthgap,intvgap):align对齐方式,hagap和vgap指定组件水平和垂直间距。testFlowLayout.javapackagetestSwing;importjava.awt.FlowLayout;importjavax.swing.*;publicclasstestFlowLayout

extendsJFrame{publictestFlowLayout(){this.setLayout(newFlowLayout());for(inti=0;i<10;i++){this.add(newJButton("JButton"+i));}}publicstaticvoidmain(String[]args){

testFlowLayoutframe=newtestFlowLayout();frame.setTitle("testFlowLayout");//设置标题frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口关闭操作frame.setBounds(100,100,300,200);//设置窗口初始位置和宽高frame.setVisible(true);//显示窗口}}手工写的class不使用MatisseForm创建【Return】9.3常用组件文本组件选择组件Panel组件对话框菜单组件【Return】9.3.1文本组件JLabelJTextFieldJPasswordFieldJTextArea【Return】JLabel特殊Jlabel--显示图形【Return】JTextFieldJTextField常用事件actionPerformed:回车事件focusGained/lostFocus:获得/失去焦点事件keyPressed/keyReleased:按下/释放键盘时事件keyTyped:打字符事件示例jTextField1jTextField2jTextField3jLabel2jLabel4主要代码“启用”按钮actionPerformed事件:jTextField1.setEditable(true);“禁用”按钮actionPerformed事件:jTextField1.setEditable(false);“获取输入值”按钮actionPerformed事件:JOptionPane.showMessageDialog(null,jTextField1.getText());jTextField1的actionPerformed事件:

jLabel2.setText("你输入的是:"+jTextField2.getText());jTextField2的focusGained事件:

jTextField4.setText("");jTextField2的KeyReleased事件:

jLabel4.setText("你输入的是:"+jTextField3.getText());创建对话框补充:DocumentListener监听器jTextField对象.getDocument().addDocumentListener(new javax.swing.event.DocumentListener(){publicvoidchangedUpdate(DocumentEvente){ //这是更改操作的处理}publicvoidinsertUpdate(DocumentEvente){ //这是插入操作的处理}publicvoidremoveUpdate(DocumentEvente){ //这是删除操作的处理}});DocumentListener示例jTextField4.getDocument().addDocumentListener(new javax.swing.event.DocumentListener(){publicvoidchangedUpdate(DocumentEvente){ jLabel5.setText("你输入的是:"+jTextField4.getText());}publicvoidinsertUpdate(DocumentEvente){ jLabel5.setText("你输入的是:"+jTextField4.getText());}publicvoidremoveUpdate(DocumentEvente){ jLabel5.setText("你输入的是:"+jTextField4.getText());}});【Return】JPasswordField与JTextField用法类似注意:此方法返回类型是字符数组char[],如果要转换为字符串,可用newString(JPasswordField1.getPassword())示例:登录窗口登录按钮ActionPerformed代码privatevoidjButton1ActionPerformed(java.awt.event.ActionEventevt){Stringusername,psd;username=jTextField1.getText();psd=newString(jPasswordField1.getPassword());if(username.equals("wustzz")&&psd.equals("123456"))

JOptionPane.showMessageDialog(this,"欢迎"+username);else{

JOptionPane.showMessageDialog(this,"用户名或密码错!");}}转化一下字符串比较用equlas()方法创建对话框取消按钮ActionPerformed代码privatevoidjButton2ActionPerformed(java.awt.event.ActionEventevt){dispose();//回收一下System.exit(0);//结束程序}改进一下:3次输入错误,关闭登录窗体添加一个计数器:privateinterrCount=0;登录按钮代码:if(username.equals("wustzz")&&psd.equals("123456"))…else{newJOptionPane().showMessageDialog(this,"用户名或密码错!");errCount++;}if(errCount==3){JOptionPane.showMessageDialog(this,"3次输入错误,将关闭登录窗体!");dispose();System.exit(0);}【Return】JTextArea示例主要代码if(jTextArea1.getSelectedText()!=null){

jTextArea1.copy();

jTextArea1.select(-1,-1);//取消选中}else{JOptionPane.showMessageDialog(null,"请选择文本");}复制按钮if(jTextArea1.getSelectedText()!=null){

jTextArea1.cut();}else{JOptionPane.showMessageDialog(null,"请选择文本");}剪切按钮jTextArea2.paste();剪切按钮【Return】9.3.2选择组件JButtonJCheckboxJRadioButtonJComboBoxJList【Return】JButtonactionPerformed事件操作jButton1.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEventevt){

jButton1ActionPerformed(evt);}});privatevoidjButton1ActionPerformed(java.awt.event.ActionEventevt){//处理代码}【Return】JCheckboxitemStateChanged事件jCheckBox1.addItemListener(newjava.awt.event.ItemListener(){publicvoiditemStateChanged(java.awt.event.ItemEventevt){ jCheckBox1ItemStateChanged(evt);}});privatevoidjCheckBox1ItemStateChanged(java.awt.event.ItemEventevt){if(jCheckBox1.isSelected()){//复选框选中//处理代码

}else{//没有选中//处理代码}

}itemStateChanged事件示例【Return】privatevoidjCheckBox1ItemStateChanged(java.awt.event.ItemEventevt){if(jCheckBox1.isSelected()){jLabel1.setFont(newjava.awt.Font("微软雅黑",Font.BOLD,18));

}else{jLabel1.setFont(newjava.awt.Font("微软雅黑",Font.PLAIN,18));}}设置字体的方法JRadioButtonJRadioButton分组同一组的单选按钮每一时刻只能选择一个。使用ButtonGroup类来分组,然后利用add()方法,把若干个单选按钮归组。用法示例:将ButtonGroup组件放入设计窗口中(该组件不可见);privatejavax.swing.ButtonGroupbuttonGroup1;buttonGroup1=newjavax.swing.ButtonGroup();使用add方法:buttonGroup1.add(jRadioButton1);buttonGroup1.add(jRadioButton2);这样jRadioButton1和jRadioButton2在同一组。代码自动生成itemStateChanged事件示例【Return】privatevoidjRadioButton1ItemStateChanged(java.awt.event.ItemEventevt){if(jRadioButton1.isSelected()){JOptionPane.showMessageDialog(null,"你选中了男");}}JComboBoxJComboBox用法示例设计时编辑model属性:生成的代码:jComboBox1.setModel(newjavax.swing.DefaultComboBoxModel(newString[]{"北京","上海","武汉"}));JComboBox用法示例(续)使用构造函数创建:String[]strs={"故宫","泰山","张家界","颐和园","孔府"};JComboBoxjComboBox1=newJComboBox(strs);

JComboBox常用方法简单测试几个JComboBox示例--级联创建JComboBox1:添加"北京","上海","武汉"几项创建JComboBox2:设置为空项:jComboBox2.setModel(newjavax.swing.DefaultComboBoxModel());JComboBox1添加ItemStateChanged事件:intindex=jComboBox1.getSelectedIndex();switch(index){case0:

jComboBox2.removeAllItems();jComboBox2.addItem("北京大学");…break;case1:…}【Return】JList构造函数:String[]strs={"北京","上海","武汉"};JListlist=newJList(strs);滚动问题JList本身不支持滚动,要滚动必须放到JScrollPane中:JScrollPanemyScrollPane=newJScrollPane();myScrollPane.setViewportView(jList1);也可使用:JScrollPanemyScrollPane=newJScrollPane(jList1);

//不使用myScrollPane.add(jList1);

MatisseForm代码自动使用JList常用方法JList示例--多值处理int[]indexs={1,2};

jList1.setSelectedIndices(indexs);//选中多项for(Objecto:jList1.getSelectedValues()){//遍历选中项System.out.print(o.toString());}

前提:selectionMode为多选JList+Vector+setListData方法添加/删除元素

Vectorvt=newVector();vt.add("北京");vt.add("上海");vt.add("武汉");

jList1.setListData(vt);vt.remove("上海");//或用vt.remove(intindex);有关Vector用法请参考JDKJList+Vector+setListData方法改进Vectorvt=newVector();

ListModellistModel=jList1.getModel();//获取JList的modelfor(intindex=0;index<listModel.getSize();index++)

vt.add(listModel.getElementAt(index));vt.add("北京");vt.add("上海");jList1.setListData(vt);vt.remove("上海");vt.add("深圳");保留原来的内容再添加新的保留原来的内容添加新内容JList+setModel方法来添加/删除元素//先用DefaultListModel来初始化JList:DefaultListModeldlm1=newDefaultListModel();dlm1.addElement("北京");dlm1.addElement("上海");dlm1.addElement("武汉");jList1.setModel(dlm1);//接着添加/删除操作:DefaultListModeldlm2=(DefaultListModel)jList1.getModel();//追加元素dlm2.addElement("广州");//或用.add(序号值,"广州");dlm2.removeElement("武汉");jList1.setModel(dlm2);强制转换的前提是jList的model已经是DefaultListModel类型【Return】9.3.3Panel组件JPanelJTabbedPanel【Return】JPanel在MatisseForm中,JPanel使用GroupLayout布局,不需要手工设置布局。√使用border属性可设置边框,但边框上没有文字。设置的边框上没有文字在边框上添加文字自定义边框方法:

.setBorder(newTitledBorder(Boder类型,"边框文字"))例如:jPanel1.setBorder(newTitledBorder(

BorderFactory.createEtchedBorder(),"边框文字"));JPanel示例–手工布局主要代码Containercp=getContentPane();cp.setLayout(newFlowLayout());//设置JFrame布局

JButtonjb=newJButton("JButton");BasicArrowButtonup=newBasicArrowButton(BasicArrowButton.NORTH),down=newBasicArrowButton(BasicArrowButton.SOUTH),right=newBasicArrowButton(BasicArrowButton.EAST),left=newBasicArrowButton(BasicArrowButton.WEST);//创建JPanel并设置布局JPaneljp=newJPanel();jp.setPreferredSize(newDimension(100,100));//设置JPanel的大小jp.setLayout(newGridLayout(2,2));jp.setBorder(newTitledBorder("方向按钮"));//为JPanel添加标题√//将组件添加到Panel中jp.add(up);jp.add(down);jp.add(left);jp.add(right);//将Panel添加到JFrame中cp.add(jb);cp.add(jp);【Return】JTabbedPaneJTabbedPane选项卡每个选项卡中又是一个Panel组件创建过程(JTabbedPane+JPanel)创建一个JTabbedPane。代码:

JTabbedPanejTabbedPane1=newJTabbedPane();将一个JPanel放在TabbedPane上部。代码:JPaneljPanel1=newJPanel();

jTabbedPane1.addTab("tab1",jPanel1);

JTabbedPaneJPanel虚线状态第一个参数是选项卡标题使用addTab方法将Panel添加到TabbedPane中创建过程(JTabbedPane+JPanel)续如果有多个选项卡,则重复上一步操作。最后选择不同的选项卡,将所需组件放置上去即可。【Return】补充:(1)创建带图形的选项卡jTabbedPane1.addTab("名称",newImageIcon("D:\\login.jpg"),jPanel1);(2)将选项卡放在下部:

jTabbedPane1.setTabPlacement(JTabbedPane.BOTTOM);(3)选择某个选项卡为当前选择的选项页:jTabbedPane1.setSelectedIndex(序号值);//从0开始9.3.4对话框对话框是一个临时窗口,一般用来向用户显示信息或接收用户输入的信息。使用javax.swing.JOptionPane来创建对话框:JOptionPane.showMessageDialogJOptionPane.showConfirmDialogJOptionPane.showInputDialog对话框示例Stringname;intselection;do{

name=JOptionPane.showInputDialog("请输入姓名:");

selection=JOptionPane.showConfirmDialog(null,“你的姓名是"+name+"?","请确认",JOptionPane.YES_NO_OPTION);}while(selection!=JOptionPane.YES_OPTION);JOptionPane.showMessageDialog(null,"你的姓名是"+name);【Return】JMenuBar(菜单栏)JMenu(菜单)JMenuItemJRadioButtonMenuItemJCheckBoxMenuIte

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论