第18章程序设计

Swing程序设计

        Swing用于开发桌面窗体程序用于JDK的第二代GUI框架,其功能比JDK第一代GUI框架AWT更为强大,性能更加优良。但因为Swing技术推出时间太早,七性能,开发效率等不及一些其他的留下技术,所以目前市场大多数桌面窗体都不是由java开发的,Swing技术也书简被广大开发人员放弃了

        不过Swing是JDK自带的功能,并且能非常好的体现出java语言在面对对象,接口时间等方面设计模式,又能提供直观的呈现运行效果,有所以本书还能纳入此内容,本章不能深入的讲解Swing技术,仅会介绍一些常用组件的使用方法

        Swing中大多数数组件均为轻量级组件,使用Swing开发出的窗体风格与当前平台(如WindowsLinux等)的窗体风格保持一致  本章讲解了主要介绍了Swing的基本要素,包括窗体的布局,容器,常用组件,如何创建表格等内容

99c9be14425e4b8c9c385d38c7ece623.png

 18.2常用窗体

创建一个不可的,具有标题的窗体如下:

 
  1. JFrame jf =new JFrame("登入系统");

  2. Container container = jf.getContenPane();

在创建窗体后,先调用getContentPane()方法将窗体转换为容器,再使用add()方法或者remove()方法想容器中添加组件或者删除容器中的组件,向容器中添加按钮 代码如下:

 
  1. JButton okBtn = new JButton("确定");

  2. container.add(okBth);//添加按钮

  3. container.remove(okBth);//删除容器中的按钮

创建窗体后,要对窗体惊醒设置  设置大小 位置,是否可见等等

 
  1. setBounds(int x,int y,int width,int leight)

  2. //设置窗体左上角在屏幕中的坐标(x,y),窗体的宽度为widttth,窗体的高度为height。

  3. setLocation(int x,int y);//设置窗体左上角在屏幕中的坐标为(x,y)

  4. setSize(int width,int heigth);设置窗体的宽度为width,高度为height

  5. setVisibale(boolean b);//设置窗体是否可见。b为true时窗体为可见;b为false时窗体为不可见

  6. setDefaultCloseOperation(int operation);

  7. //设置窗体的关闭方式,默认值为DISPOSE_ON_CLOSE Java语言提供了多种窗体的关闭方式,

 JFrame窗体关闭的几种方式

窗体关闭方式实现功能
DO_NOTHING_ON_CLOSE关闭窗体时,不触发任何操作
DISPOSE_ON_CLOSE关闭窗体时,释放窗体资源,窗体会消失但是程序不会停止
HIDE_ON_CLOSE关闭窗体时,仅隐藏舱体,不释放资源
EXIT_ON_CLOSE关闭窗体时,释放窗体资源并关闭程序

 创建一个JFreamTest类 在JFreamTest类中创建一个内容为“这是JFrame窗体”后把这个白哦前添加到窗体中  代码如下:

 
  1. import java.awt.Container;

  2.  
  3. import javax.swing.JFrame;

  4. import javax.swing.JLabel;

  5. import javax.swing.SwingConstants;

  6. import javax.swing.WindowConstants;

  7.  
  8. public class jFreamTest {

  9.  
  10. public static void main(String[] args) {

  11. JFrame jf = new JFrame();//创建一个窗口对象

  12. jf.setTitle("创建一个JFrame 窗体");//设置窗口标题

  13. Container container = jf.getContentPane();//获取主容器

  14. JLabel jl = new JLabel("这是一个JFrame 窗体");//一个文本标签

  15. jl.setHorizontalAlignment(SwingConstants.CENTER);//将标签上的文字居中

  16. container.add(jl);//将标签添加到著容器中

  17. jf.setSize(300,150);//设置窗体宽高

  18. jf.setLocation(320,240);//设置窗体在屏幕中出现的位置

  19. jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序

  20. jf.setVisible(true);//让窗体展示出来

  21. }

  22. }

 代码图如下:

57368cadea1b4b4c856ae6b0b36ff8f1.png

 运行结果如下:

19e0772fbfda4fa2bb522b1442642e5a.png

18.2.2JDialog对话框

        JDialong对话框继承了java.awt.Dialog类,其功能是从一个窗体弹出另一个窗体,如使用IE浏览器时弹出的确定对话框JDialog对话框与JFrame窗体类似,被使用也需要先调用getContentPane()方法Jdialog对话捐给转换为容器再对JDialog对话框进行设置

 
  1. public JDialong();创建一个没有标题和父窗体的对话框

  2. public JDialong(Frame f);//创建一个没有标题的,但有父窗体的对话框

  3. public JDialong(Frame f ,boolean model);//创建一个没有标题但指定

  4. 父窗体和模式的对话框 如果model为true,那么弹出对话框后,用户无法操作父窗体

  5. public JDialong(Frame f ,String title);

  6. //创建一个指定标题和父窗体的对话框

  7. public JDialong(Frame f ,boolean model);//创建一个指定标题 父窗体和模式的对话框

 例题在弹窗中弹出对话框:

 
  1.  
  2. import java.awt.*;

  3. import java.awt.event.*;

  4. import javax.swing.*;

  5.  
  6.  
  7. class MyJDialog extends JDialog{//自定义对话框类 继承了JDialog

  8. public MyJDialog(MyFrame frame) {

  9. //调用父类构造方法,第一个参数是父窗体,第二个参数是窗体标题 //第三个参数是表示阻塞父窗体

  10. super(frame,"第一个JDialog窗体",true);

  11. Container container=getContentPane();//获取主容器

  12. container.add(new JLabel("这是一个对话框"));//在容器中添加标签

  13. setBounds(120,120,100,100);//设置对话框在桌面先是的坐标和大小

  14. }

  15. }

  16. public class MyFrame extends JFrame {//自定义窗体类 继承JFrame

  17. public MyFrame() {//窗体的构造方法

  18. Container container=getContentPane();//获得窗体的构造方法

  19. container.setLayout(null);//容器使用绝对布局

  20. JButton bl=new JButton("弹出对话框");//创建一个按钮

  21. bl.setBounds(10,10,100,21);//定义按钮在容器中的坐标和大小

  22. bl.addActionListener(new ActionListener() {//为按钮添加单击事件

  23. public void actionPerformed(ActionEvent e) {//单机事件的触发方法

  24. MyJDialog dialog=new MyJDialog(MyFrame.this);//创建MYJDialo对话框

  25. dialog.setVisible(true);//使对话框可见

  26. }

  27. });

  28. container.add(bl);//将按钮添加到容器中

  29. setSize(200,200);//窗体的宽高

  30. setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序

  31. setVisible(true);//使窗体可见

  32. ;}

  33. public static void main(String[] args){

  34. new MyFrame();

  35. }

  36. }

 

 代码图如下:

9d6e9852fc7743a486796b8b790436af.png

 运行结果图:

62025df226234b2a83b5bea330c1f779.png

18.2.3JOptionPane小型对话框

一个非常便捷的小型对话框,该类用于创建对话框的方法都是静态方法,无需创建对象即可弹出,在日常开发中经常使用该类唐初提示确认用户需求  

4种创建对话框的方法

        方法描述
showConfirmDialog()确认框,询问一个确认问题,如yes/no/cancel
showIputDialog()输入框,可以让用户向程序输入某些之
showMessageDialog()通知框,告知用户某事已经发生
showOptionDialog()自定义对话框,集合了上述3种对话框的全部功能

自定义对话框:

 
  1. public static int showOptionDialog( Component parentComponent

  2. Oject message;

  3. String title;

  4. int optionType;

  5. int messageType;

  6. lcon icon;

  7. Object[] options;

  8. Object initialValue)

  9. }

参数如下:

 
  1. parentComponent:知名对话框在哪个窗体上显示,如果传入就提的窗体对象和,

  2. 对话框会在该窗体居中位置先是 如果传入的是null则会在屏幕中间弹出对话框

  3. message:提示信息

  4. title:对话框的标题

  5. optionType:指定可用对话框的选项的整数

  6. messageType:指定消息种类的整数,主要确定来字可插入外观的图标

  7. options:只是用户可能选择的对象组成的数组。如果对象是组件,则可以正确的呈现,非String对象使用toString方法呈现,如果此参数为null,则由外观确定选项

  8. initiaIValueL表示对话框默认的对象只用options时才有意义,可以为null

以下有四种对话框的例题  代码如下:

弹出会话框

 
  1. import javax.swing.Icon;

  2. import javax.swing.ImageIcon;

  3. import javax.swing.JButton;

  4. import javax.swing.JOptionPane;

  5.  
  6. public class Demo {

  7.  
  8. public static void main(String[] args) {

  9. Object o[]= {new JButton("是的"),new JButton("再想想")};//按钮对象的Object数组

  10. Icon icon = new ImageIcon("src/注意.png");//获取图标对象

  11. JOptionPane.showOptionDialog(null,

  12. "你准备好了吗?",

  13. "注意了!",

  14. JOptionPane.DEFAULT_OPTION,

  15. JOptionPane.DEFAULT_OPTION,

  16. icon,o,null);

  17. }

  18.  
  19. }

代码图以及运行结果图:

975609b1f0144580a49cd983d6c9601e.png

 确认框:

 
  1. import javax.swing.JOptionPane;

  2.  
  3. public class Demo1 {

  4.  
  5. public static void main(String[] args) {

  6. int answer=JOptionPane.showConfirmDialog

  7. (null, "确定离开吗?","标题",JOptionPane.YES_NO_OPTION);

  8. //18.4

  9. }

  10.  
  11. }

代码图以及运行结果图:

367f9e9b50f54d549e010c62fd4aef61.png

 输入框:

 
  1. import javax.swing.JOptionPane;

  2.  
  3. public class Demo3 {

  4.  
  5. public static void main(String[] args) {

  6. String name=JOptionPane.showInputDialog(null,"请输入您的姓名");

  7.  
  8. }

  9.  
  10. }

代码图以及运行结果图: 

5c7c3d0b60c8499a8168d8cd94174485.png

 警告对话框:

 
  1. import javax.swing.JOptionPane;

  2.  
  3. public class Demo2 {

  4.  
  5. public static void main(String[] args) {

  6. // TODO Auto-generated method stub

  7. JOptionPane.showConfirmDialog(null,

  8. "您与服务器断开了链接",

  9. "发生错误",

  10. JOptionPane.ERROR_MESSAGE);

  11. }

  12. }

运行结果图以及代码图

f23106b47faa494585f69762edae6ff8.png

 18.3.1null绝对布局

绝对布局也叫做null布局,其特点是影星质地的那个组件在容器中的位置和大小,组件的位置是通过绝对坐标的方式来制定的,使用绝对布局首先要Container.setLayout(null)方法取消容器中的布局管理器,然后再用Componnent,setBounds(int x,int y ,int width ,int height)方法来设置每个组件在容器中的位置和大小,如以下例题所示:

使用绝对布局定位按钮位置和大小:

 
  1. import java.awt.Container;

  2.  
  3. import javax.swing.JButton;

  4. import javax.swing.JFrame;

  5. import javax.swing.WindowConstants;

  6.  
  7. public class AbsoulutePosition extends JFrame{

  8. public AbsoulutePosition() {

  9. setTitle("本窗体使用绝对布局");//窗体标签

  10. setLayout(null);//使用null布局 绝对布局

  11. setBounds(0,0,300,150);//设置窗体的坐标与宽高

  12. Container c =getContentPane();//获取主容器

  13. JButton b1 =new JButton("按钮1");//创建按钮1

  14. JButton b2 =new JButton("按钮2");//创建按钮2

  15. b1.setBounds(10,30,80,30);//这是按钮1的位置和大小

  16. b2.setBounds(60,70,100,20);//设置按钮2 的位置和大小

  17. c.add(b1);//向容器内添加按钮1

  18. c.add(b2);//向容器内添加按钮2

  19. setVisible(true);//使窗体可见

  20. setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序

  21.  
  22. }

  23. public static void main(String[]args) {

  24. new AbsoulutePosition();

  25. }

  26. }

代码图以及运行结果图:

5d00f397c4db4ef88ef59a8242a84368.png

 18.3.2FlowLayout流布局管理器-

流布局(FlowLayout)管理器是Swing种最基本的布局管理器。使用流布局管理器拜访组件,组件时被从左到右拜访。当组件占据了当前的所有弓箭是 ,溢出的组件会被移动到当前行的下一行,默认情况下,行组建的排列方式被指定为剧中对其,但是通过设置可以更改没有行组建的排序方式

FlowLayout类具有以下常用的构造方法:

 
  1. public FlowLayout()

  2. public FlowLayout(int alignment)

  3. public FlowLayout(int alignment,interestinghorizGap,int vertGap)

  4. 构造方法种alignment参数表示使用流布局管理器是每一行组建的排列方式,

  5. 该参数可以被赋予FlowLayout.LEFT,flowLayout.CENTER或Flow Layout。RIGHT

alignment参数值说明
FlowLayout.LEFT每一行组件的排列方式被指定为左对齐
FlowLayout.CENTER每一行组件的排列方式被指定为剧中对齐
FlowLayout.RIGHT每一行组件的排列方式被指定为右对其

 在public FlowLayout(int alignnment,int horizGap,int vertGap)还存在horizGap和vertGap两个参数,这两个参数分别以像素为单位指定组件与组件之间的水平间隔和垂直间隔

例题如下:

 
  1. import java.awt.Container;

  2. import java.awt.FlowLayout;

  3.  
  4. import javax.swing.JButton;

  5. import javax.swing.JFrame;

  6. import javax.swing.WindowConstants;

  7.  
  8. public class FlowLayoutPosition extends JFrame{

  9. public FlowLayoutPosition() {

  10. setTitle("本窗体使用流布局管理器");//设置窗体标签

  11. Container c =getContentPane();

  12. //窗体使用流布局 组件右对齐,组件之间的水平间隔为10像素,垂直间隔为10像素

  13. setLayout(new FlowLayout(FlowLayout.RIGHT,10,10));

  14. for(int i=0;i<10;i++) {//在容器中循环添加10按钮

  15. c.add(new JButton("button"+i));

  16. }

  17. setSize(300,200);//设置窗体大小

  18. setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序

  19. setVisible(true);//使窗体可见

  20. }

  21. public static void main(String[] args) {

  22. new FlowLayoutPosition();

  23. }

  24.  
  25. }

代码图以及运行结果图如下:

97776f8a1d1746289eba14f290e4cf77.png

18.3.3BorderLayout边界布局管理器 

使用Swing创建窗体后,容器默认的布局管理器是边界布局(BorderLayout)管理器,边界布局管理把容器规划为东西南北中五个区域使用方法如下

代码如下:

 
  1. import java.awt.BorderLayout;

  2. import java.awt.Container;

  3.  
  4. import javax.swing.JButton;

  5. import javax.swing.JFrame;

  6. import javax.swing.WindowConstants;

  7.  
  8. public class BorderLayoutPosition extends JFrame {

  9. public BorderLayoutPosition() {

  10. setTitle("这个窗体使用边界布局管理器");//获取主容器

  11. Container c = getContentPane();//容器使用边界布局

  12. setLayout(new BorderLayout());

  13. JButton centerBtn = new JButton("中");

  14. JButton northBth = new JButton("北");

  15. JButton southBut = new JButton("南");

  16. JButton westBtn = new JButton("西");

  17. JButton eastBth = new JButton("东");

  18. c.add(centerBtn,BorderLayout.CENTER);//中部添加按钮

  19. c.add(northBth,BorderLayout.NORTH);//北部添加按钮

  20. c.add(southBut,BorderLayout.SOUTH);//南部添加按钮

  21. c.add(westBtn,BorderLayout.WEST);//西部添加按钮

  22. c.add(eastBth,BorderLayout.EAST);//东部添加按钮

  23. setSize(350,200);//设置窗体大小

  24. setVisible(true);//设置可见

  25. setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);//关闭窗体则定制程序

  26. }

  27. public static void main(String[] args) {

  28. new BorderLayoutPosition();

  29. }

  30. }

代码图即允许结果如下:

b0cd7423bae64fe7983d01aa4c1ee4c1.png

 18.3.4GridLayout网络布局管理器

网络布局管理器(GridLayout)管理器能够把容器划分为网格,组件课按行列进行决定,在网格的大小都相同,例如  一个两行两列的网格布局管理器能够产生4个大小相同的网格,组件从网格的左上角开始按照从左到右,从上到下的顺序来添加到网格中,且每个组件都会被填满整个网格,改变窗体大小时,组件大小也会随之改变 使用方法如下:

代码如下:

 
  1. import java.awt.*;

  2. import javax.swing.*;

  3.  
  4. public class GridLayoutPositon extends JFrame{

  5. public GridLayoutPositon() {

  6. Container c=getContentPane();

  7. setLayout(new GridLayout(7,3,5,5));

  8. //设置容器使用网格布局管理器,设置7行3列的网格,组件件水平间距为5像素,垂直间距为5像素

  9. for(int i=0;i<20;i++) {//循环添加按钮

  10. c.add(new JButton("button"+i));

  11. }

  12. setTitle("这是一个使用网格布局管理器的窗体");

  13. setSize(300,300);//窗体大小

  14. setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序

  15. setVisible(true);//设为可见

  16.  
  17. }

  18. public static void main(String[] args) {

  19. new GridLayoutPositon();

  20. }

  21.  
  22. }

代码图以及允许结果图如下:

14337911d0584ff1b78c49941f8466ef.png

 18.4常用面板

在Swing程序设计中  面板是一个容器,被用于容纳其他组件但是面板必须添加到其他容器中Swing中常用的面板包括了JPanel面板和JScrollPane面板

18.4.1JPanel面板

JPanel面板继承了java.awt.Container类JPanel面板必须在窗体容器中使用,无法脱离窗体显示

如下例题所示:

 
  1. import java.awt.BorderLayout;

  2. import java.awt.Container;

  3. import java.awt.GridLayout;

  4.  
  5. import javax.swing.BorderFactory;

  6. import javax.swing.JButton;

  7. import javax.swing.JFrame;

  8. import javax.swing.JPanel;

  9. import javax.swing.WindowConstants;

  10.  
  11. public class JPanelTest extends JFrame{

  12. public JPanelTest() {

  13. Container c =getContentPane();

  14. //将整个容器设置为2行2列的网格布局,组件水平间距隔10像素,垂直间距为10px;

  15. c.setLayout(new GridLayout(2,2,10,10));

  16. //初始化一个面板,此面板使用1行4列的网格布局组件水平间隔10px 垂直间隔为10px

  17. JPanel p1 =new JPanel (new GridLayout(1,4,10,10));

  18. //初始化一个面板 此面板使用边界布局

  19. JPanel p2 =new JPanel (new BorderLayout());

  20. //初始化一个面板,此面板使用1行2列的网格布局组件水平间隔10px 垂直间隔为10px

  21. JPanel p3 =new JPanel (new GridLayout(1,2,10,10));

  22. //初始化一个面板,此面板使用2行1列的网格布局组件水平间隔10px 垂直间隔为10px

  23. JPanel p4 =new JPanel (new GridLayout(2,1,10,10));

  24. //给每个面板都添加边框和标题,使用BorderFactory工厂类生成带标题边框的对象

  25. p1.setBorder(BorderFactory.createTitledBorder("面板1"));

  26. p2.setBorder(BorderFactory.createTitledBorder("面板2"));

  27. p3.setBorder(BorderFactory.createTitledBorder("面板3"));

  28. p4.setBorder(BorderFactory.createTitledBorder("面板4"));

  29. //向面板1中添加按钮

  30. p1.add(new JButton("b1"));

  31. p2.add(new JButton("b1"));

  32. p3.add(new JButton("b1"));

  33. p4.add(new JButton("b1"));

  34. //向面板2中添加按钮

  35. p2.add(new JButton("b2"),BorderLayout.WEST);

  36. p2.add(new JButton("b2"),BorderLayout.EAST);

  37. p2.add(new JButton("b2"),BorderLayout.NORTH);

  38. p2.add(new JButton("b2"),BorderLayout.SOUTH);

  39. p2.add(new JButton("b2"),BorderLayout.CENTER);

  40. //向面板3中添加按钮

  41. p3.add(new JButton("b3"));

  42. p3.add(new JButton("b3"));

  43. //向面板4中添加按钮

  44. p4.add(new JButton("b4"));

  45. p4.add(new JButton("b4"));

  46. //向容器中添加面板

  47. c.add(p1);

  48. c.add(p2);

  49. c.add(p3);

  50. c.add(p4);

  51. setTitle("在这个窗体中使用面板");

  52. setSize(500,300);

  53. setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序

  54. }

  55. public static void main(String[] args) {

  56. JPanelTest test = new JPanelTest();

  57. test.setVisible(true);

  58. }

  59.  
  60. }

 代码图以及允许结果图如下:

357f885d408c42dc84901d39ad8cd9e0.png

 18.4.2JScrollPane滚动面板

JScrollPane面板时带动滚动条的面板,是被用于在较小的窗体中先是较大的篇幅内容,需要注意JScrollPane滚动面板不能使用布局管理器,且只能容纳一个组件。如果需要向JScrollPane面板中添加多个组件,那么需要先将多个逐渐添加到JPanel面板,在将JPanel面板添加到滚动面板  实际使用如下:

 
  1. import java.awt.Container;

  2.  
  3. import javax.swing.JFrame;

  4. import javax.swing.JScrollPane;

  5. import javax.swing.JTextArea;

  6. import javax.swing.WindowConstants;

  7.  
  8. public class JScrollPaneTest extends JFrame {

  9. public JScrollPaneTest(){

  10. Container c =getContentPane();//获取主容器

  11. //创建一个文本域组件 文本域默认大小为20行50列

  12. JTextArea ta = new JTextArea(20,50);

  13. //创建一个JScrollPane滚动面板,并将文本域放到滚动面板中

  14. JScrollPane sp = new JScrollPane(ta);

  15. c.add(sp);//将该面板添加到竹筒其中

  16. setTitle("带有滚动条的文字编辑器");

  17. setSize(400,200);

  18. setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序

  19. }

  20. public static void main(String[] args) {

  21. JScrollPaneTest test =new JScrollPaneTest();

  22. test.setVisible(true);

  23.  
  24. }

  25.  
  26. }

 

代码图以及允许结果图如下:

9eb15ed54f04439d8096acc9b7317290.png


18.5文字标签组件与图标

在Swing程序设计中,标签(JLabel)被用于先是文本,图标等内容,在Swing应用程序中用户界面中,用户能通过标签上的文本,图标等内容获得相应的提示信息

18.5.1JLabel标签

baioqain (JLabel)的弗雷什JCompont类,虽然标签不能被添加监听器,但是标签显示的文本图标内容可以被知道那个对齐方式

        通过JLabel类的构造方法们可以创建多种标签,如显示只有文本的标签,只有图标的标签以及同时包含文本和图标的标签等  使用方法如下:

 
  1. public JLabel();//创建一个不带图标和文本的标签

  2. public JLabel(Icon icon);//创建一个带图标的标签

  3. public JLabel(Icon icon ,int aligment);创建以恶给带图标的标签,并设置图标的水平对齐方式

  4. public JLabel(String text,int aligment);//创建一个带文本标签,并设置文本的水平对齐方式

  5. public JLabel(Icon icon ,String text, int aligment);

  6. //创建一个带文本和图标的JLabel对于宣布发,并设置文本和图标的水平对齐方式

 具体使用方法如下代码所示:

 
  1. import java.awt.Container;

  2.  
  3. import javax.swing.JFrame;

  4. import javax.swing.JLabel;

  5. import javax.swing.SwingConstants;

  6. import javax.swing.WindowConstants;

  7.  
  8. public class jFreamTest {

  9.  
  10.     public static void main(String[] args) {

  11.         JFrame jf = new JFrame();//创建一个窗口对象

  12.         jf.setTitle("创建一个JFrame 窗体");//设置窗口标题

  13.         Container container = jf.getContentPane();//获取主容器

  14.         JLabel jl = new JLabel("这是一个JFrame 窗体");//一个文本标签

  15.         jl.setHorizontalAlignment(SwingConstants.CENTER);//将标签上的文字居中

  16.         container.add(jl);//将标签添加到著容器中

  17.         jf.setSize(300,150);//设置窗体宽高

  18.         jf.setLocation(320,240);//设置窗体在屏幕中出现的位置

  19.         jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序

  20.         jf.setVisible(true);//让窗体展示出来

  21.     }

  22. }

 代码图以及允许结果图如下:

123b276986b54b8488d2d35824629e12.png

 18.5.2图标的使用

在Swing程序设计中,图标经常被添加到标签,按钮组件,使用javax.Swing.ImageIcon类可以根据现有的图片创建图片,UmageIcon类实现了Icon接口,他有多个构造方法  构造方法使用如下:

18.6按钮组件

在Swing程序设计中蛮牛是较见的组件,被用于出发特定的动作  ,Swing提供了多种按钮组件,按钮,单选按钮, 复选框等,

18.6.1JButton按钮
Swing按钮由JButton对象标识JButton常用的构造方法如下:

 
  1. public JBtton();//创建一个不带文本或者图标的按钮

  2. public JBtton(String text);创建一个带文本的按钮

  3. public JBtton(Icon icon);//创建一个带图标的按钮

  4. public JBtton(String  text ,Icon icon);//创建一个带文本和图标的按钮

 JButton类的常用方法以及说明

方法说明
SetIcon(Icon defauItIcon)设置按钮图案
setToolTipText(String text)为按钮设置提示文字
setBorderPainted(boolean b)如果b的值为true且按钮又边框,那么绘制边框borderPainted属性的默认值为true
setEnable(boolean b)这是按钮释放可用。b的值为true时,表示按钮可用;b的值为false时表示按钮不可用

​18.6.2JRadioButton单选按钮:

Swing单选按钮由JRadioButton对象表示,在Swing程序设计中,需要把多个单选按钮添加到按钮组中,当用户选中某哥单选按钮时,按钮组中的其他单选按钮将不能被同时选中

创建一个JRadioButton对象需要使用JRadioButton类的构造方法。JRadioButton类常用的构造方法如下:

 
  1. public JRadioButton()//创建一个未被选中,文本违背定义的,具有指定图标的单选按钮

  2. public JRadioButton(Icon icon)//创建一个违背选中的。文本违背选设定的,具有指定图标的单选按钮

  3. public JRadioButton(Icon icon ,boolean selected)

  4. //创建一个具有指定图标。选择状态,但文本未被选定的单选按钮

  5. public JRadioButton(String text)//创建一个具有指定文本,单位本选定的单选按钮

  6. public JRadioButton(String text , Icon icon)//创建一个具有指定的文本,指定图标,但未被选中的单选按钮

  7. public JRadioButton(Stirng text,Icon icon ,boolean selected)//创建一个具有指定文本,指定图标和选择状态的单选按钮

如下代码所示:

 
  1. import javax.swing.ButtonGroup;

  2. import javax.swing.JFrame;

  3. import javax.swing.JLabel;

  4. import javax.swing.JRadioButton;

  5.  
  6. public class RadioButtonTest extends JFrame {

  7. public RadioButtonTest(){

  8. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  9. setTitle("单选按钮的使用");

  10. setBounds(100,100,240,120);

  11. getContentPane().setLayout(null);//设置绝对布局

  12. JLabel lblNewLabel = new JLabel("请选择性别");

  13. lblNewLabel.setBounds(5,5,120,15);

  14. getContentPane().add(lblNewLabel);

  15. JRadioButton rbtnNormal = new JRadioButton("楠");

  16. rbtnNormal.setSelected(true);

  17. rbtnNormal.setBounds(40,30,75,22);

  18. getContentPane().add(rbtnNormal);

  19. JRadioButton rbthPwd = new JRadioButton("女");

  20. rbthPwd.setBounds(120,30,75,22);

  21. getContentPane().add(rbthPwd);

  22. ButtonGroup group =new ButtonGroup();//创建按钮组 把交互买哪般中的单选按钮添加到按钮组中

  23. }

  24. public static void main(String[] args) {

  25. // TODO Auto-generated method stub

  26. RadioButtonTest frame =new RadioButtonTest();//创建窗体对象

  27. frame.setVisible(true);//使窗体可见

  28. }

  29.  
  30. }

 代码图以及允许结果图如下:

f552ec17afa4459ab167da0f2cd023b4.png

 

 18.6.3JCheckBox复选框

复选框组件由JCeckBox对象标识,与单选按钮不同的时,窗体中的复选框可以被选中多个这是因为每一个复选框“被选中”和"不被选中"两种状态:

 
  1. public JCeckBox();创建一个文本,图标未被设定为默认未被选中的复选框

  2. public JCeckBox(Icon icon,Boolean checked)创建一个具有指定图标的,指定初始时释放被选中,但图标违背社厅复选框

  3. public JCeckBox(String text Boolean checked);创建一个具有指定文本,指定初始时释放被选中,但图标设定的复选框

使用代码如下:

 
  1. import java.awt.*;

  2. import java.awt.event.*;

  3. import javax.swing.*;

  4. public class CheckBoxTest extends JFrame{

  5. public CheckBoxTest() {

  6. setBounds(100,100,170,110);//窗口坐标和大小

  7. setDefaultCloseOperation(EXIT_ON_CLOSE);

  8. Container c=getContentPane();//获取主容器

  9. c.setLayout(new FlowLayout());//容器使用流布局

  10. JCheckBox c1=new JCheckBox("1");//创建复选框

  11. JCheckBox c2=new JCheckBox("2");

  12. JCheckBox c3=new JCheckBox("3");

  13. c.add(c1);//添加复选框

  14. c.add(c2);

  15. c.add(c3);

  16. JButton btn=new JButton("打印");//添加打印按钮

  17. btn.addActionListener(new ActionListener() {//打印按钮动作时间

  18. public void actionPerformed(ActionEvent e) {

  19. System.out.println(c1.getText()+"按钮选中状态"+c1.isSelected());

  20. System.out.println(c2.getText()+"按钮选中状态"+c2.isSelected());

  21. System.out.println(c3.getText()+"按钮选中状态"+c3.isSelected());

  22.  
  23. }

  24. });

  25. c.add(btn);

  26. setVisible(true);//容器添加了打印按钮

  27. }

  28. public static void main(String[] args) {

  29. new CheckBoxTest();

  30.  
  31. }

  32.  
  33. }

代码图以及允许结果图如下:

ae19751f54094f36844825503014aaed.png

18.7列表组件 

Swing中提供两种列表组件,分别是下拉列表框与列表框。下拉列表框与列表框都是带有一系列列表组件,用户可以从中选择需要列表项,列表框较下拉列表框更直观,他将所有的列表向罗列在俩表中,但是,下拉列表框比较列表框更为便捷,美观,他将所有列表项隐藏起来,当用户选用其中列表向才会显现出来

18.7.1JcomboBox第一次使用下拉列表框,会感觉Swing中下拉列表框与Windows系统中下拉列表框有一些相似,实质上两种并不完全相同,因为Swing中下来列表框不仅可以供用户从中选择,也提供了编辑列表项的功能  如下所示:

 
  1. public JComboBox(ComboBoxModel dataModel)//创建一个JComboBox类是java.Swing.JCmboBox类的子类

  2. public JComboBox(Object[]arrayData)//创建一个包含数组中的元素的JComboBox对象

  3. public JComboBox(Vector vector)//创建一个包含指定Vector对象中的元素的JComboBox对象

使用方法如下:

 
  1.  
  2. import java.awt.event.*;

  3. import javax.swing.*;

  4. public class JComboBoxText extends JFrame {

  5. public JComboBoxText() {

  6. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  7. setTitle("下拉列表框的使用");

  8. setBounds(100,100,317,147);

  9. getContentPane().setLayout(null);//设置绝对布局

  10. JLabel lblNewlabel=new JLabel("请选择证件:");

  11. lblNewlabel.setBounds(28,14,80,15);

  12. getContentPane().add(lblNewlabel);

  13. JComboBox<String>comboBox=new JComboBox<String>();//创建一个下来列表框

  14. comboBox.setBounds(110,11,80,21);//设置坐标

  15. comboBox.addItem("身份证");//为下来列表中添加项

  16. comboBox.addItem("军人证");

  17. comboBox.addItem("学生证");

  18. comboBox.addItem("工作证");

  19. comboBox.setEditable(true);

  20. getContentPane().add(comboBox);//将下拉列表添加到容器中

  21. JLabel IblResult=new JLabel("");

  22. IblResult.setBounds(0,57,146,15);

  23. getContentPane().add(IblResult);

  24. JButton btnNewButton=new JButton("确定");

  25. btnNewButton.setBounds(200,10,67,23);

  26. getContentPane().add(btnNewButton);

  27.  
  28. btnNewButton.addActionListener(new ActionListener() {//为按钮添加监听事件

  29. @Override

  30. public void actionPerformed(ActionEvent e) {

  31. IblResult.setText("您选择的是:"+comboBox.getSelectedItem());

  32. }

  33. });

  34.  
  35. }

  36. public static void main(String[] args) {

  37. JComboBoxText frame=new JComboBoxText();//创建窗体对象

  38. frame.setVisible(true);

  39. }

  40.  
  41.  
  42. }

 代码图以及允许结果图:

41cdeba44cb94642abcd1608f5d666ff.png

 

 18.8文本组件

文本组件在开发Swing程序过程中经常被用到,尤其是文本框组件和密码框组件,使用文本组件可以轻松的操作单行文字,多行文字口令字段等文本内容

18.8.1JTextField文本框

文本框组件由JFextField对象表示JTextField类的常用构造方法如下:

 
  1. public JTextField();创建一个文本未被指定的文本框

  2. public JTextField(String text);创建一个指定文本的文本框

  3. public JTextField(int fieldwidth);创建一个只当列宽的文本框

  4. public JTextField(String text,int fieldwidth);创建以恶给指定为呢本列宽的文本框

  5. public JTextField(Document docModel,String text,int fieldwidth);

  6. //创建一个定制文本模型,文本内容和列宽的文本框

 以下代码讲解使用方法:

 
  1. import java.awt.*;

  2. import java.awt.event.*;

  3. import javax.swing.*;

  4.  
  5. public class JTextFieldTest extends JFrame{

  6.  
  7. public JTextFieldTest() {

  8. Container c=getContentPane();//获取窗体工期

  9. c.setLayout(new FlowLayout());

  10. JTextField jt=new JTextField("请点击清除按钮");//设定文本框初始值

  11. jt.setColumns(20);//设置文本框长度

  12. jt.setFont(new Font("宋体",Font.PLAIN,20));//设置字体

  13. JButton jb=new JButton("清除");

  14. jt.addActionListener(new ActionListener() {//为文本框添加回车事件

  15. public void actionPerformed(ActionEvent e) {//

  16. jt.setText("触发事件");//设置文本框中的值

  17. }

  18. });

  19. jt.addActionListener(new ActionListener() {//为按钮添加时间

  20. public void actionPerformed(ActionEvent e) {

  21. System.out.println(jt.getText());//输出当前文本框的值

  22. jt.setText("");//将文本框置空

  23. jt.requestFocus();//焦点回到文本框

  24. }

  25. });

  26. c.add(jt);//窗体容器添加文本框

  27. c.add(jb);//窗体添加按钮

  28. setBounds(100,100,250,110);

  29. setVisible(true);

  30. setDefaultCloseOperation(EXIT_ON_CLOSE);

  31. }

  32. public static void main(String[] args) {

  33. new JTextFieldTest();

  34. }

  35.  
  36. }

 代码图以及允许结果图如下:

a6d2b2943085416197ac9d15aec28da3.png18.8.2JPasswordField密码框

密码框组件由JPasswordField对象表示,其作用十八用户输入的字符串以某种符号进行加密类的常用构造方法如下JPasswordField类的构造方法如下:

 
  1. public JPasswordField();创建一个文本未被指定的密码框

  2. public JPasswordField(String text);创建一个指定的密码框

  3. public JPasswordField(int fieldwidth);创建一个指定列宽的密码框

  4. public JPasswordField(String text,int fieldwidth);创建个只当文本和列宽的密码框

  5. public JPasswordField(Document docModel,String text,int fieldWidth);//创建一个指定文本模型和列宽的密码框

18.8.3JTextArea文本域

文本与组键JTextArea对象表示,起作用是接受用户多行文本输入,类的常用构造方法

JTextArea

 
  1. public JTextArea();创建一个文本违背指定的文本域

  2. public JTextArea(String tsxt);//创建一个指定文本的文本域

  3. public JTextArea(int rows ,int columns);创建一个指定行高和列宽,但文本未被指定的文本域

  4. public JTextArea(Docunment doc);//创建一个指定文档模型的文本域

  5. public JTextArea(Document doc ,String Text ,int rows, intcolumns);创建一个指定文档母校,文本内容以及行高和列狂的文本域

主要的使用方法 如下例题所示:

 
  1. import java.awt.Container;

  2.  
  3. import javax.swing.JFrame;

  4. import javax.swing.JTextArea;

  5. import javax.swing.WindowConstants;

  6.  
  7. public class JTextAreaTest extends JFrame {

  8. public JTextAreaTest() {

  9. setSize(200,100);//定义文本域长宽

  10. setTitle("定义自动换行的文本域");

  11. setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

  12. Container cp =getContentPane();//获得窗体容器

  13. //创建一个文本内容为"为文本域"行高和列宽均为6的文本域

  14. JTextArea jt =new JTextArea("文本域",6,6);

  15. jt.setLineWrap(true);//可以自动换行

  16. cp.add(jt);

  17. setVisible(true);

  18. }

  19. public static void main(String[] args) {

  20. // TODO Auto-generated method stub

  21. new JTextAreaTest();

  22. }

  23.  
  24. }

 代码如图以及运行结果如下所示

5b4d15c2f42747f49364b117301c82a7.png

 18.9表格组件

Swing表格JTable对象表示 其作用是把数据以表格的形式显示给用户

18.9.1创建表格

JTable类除了提供了默认的构造方法外,还提供了被用于显示二维数组中的元素的构造方法如下所示

 
  1. JTable(Object[][] rowDate,Object[]columnNames)

  2. rowDate//存储表格数据的二维数组

  3. cilumnNames;//存储表格列明的一维数组

主要的使用方法如下所示:

 
  1.  
  2. import java.awt.*;

  3. import java.awt.event.*;

  4. import javax.swing.*;

  5. import javax.swing.table.*;

  6. public class SortingTable extends JFrame {

  7. private static final long serialVersionUID=1L;

  8.  
  9. public static void main(String[] args) {

  10. SortingTable frame=new SortingTable();

  11. frame.setVisible(true);

  12. }

  13. public SortingTable() {

  14. setTitle("表格模型与表格");

  15. setBounds(100,100,240,150);

  16. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  17. JScrollPane scrollPane=new JScrollPane();

  18. getContentPane().add(scrollPane,BorderLayout.CENTER);

  19. String[]columnNames= {"A","B"};//定义表格列名数组

  20. String[][]tableValues= {{"A1","B1"},{"A2","B2"},{"A3","B3"}};

  21. //定义表格数据数组

  22. DefaultTableModel tableModel=new DefaultTableModel(tableValues,columnNames);

  23. //创建指定列明和数据的表格

  24. JTable table=new JTable(tableModel);

  25. //创建显示表格的滚动面板

  26. table.setRowSorter(new TableRowSorter<>(tableModel));

  27. //将滚动面板添加到边界布局的中

  28. scrollPane.setViewportView(table);

  29.  
  30. }

  31. }

 代码图以及运行结果图如下:

26304988d1d44eae90c3f2039e446fa7.png

18.9.2DefultTableModel表格数据模型

Swing使用TableModel接口定义了一个表格模型 AbstactTableModel抽象类实现了TableModel接口的大部分方法

 
  1. public int getTowCount();

  2. public intgetCikumnCount();

  3. public Object getValueAt(int rowIndex,intcolumnIndex)

为了实现表格模型创建表格的功能,Swing提供了表格模型,即DefaultTableModel类继承了AbstractTableMode抽象类且显示了上述3个抽象方法类提供了常DefaultTableModel用构造方法

以下例题所示使用方法:

 
  1.  
  2. import java.awt.*;

  3. import java.awt.event.*;

  4. import javax.swing.*;

  5. import javax.swing.table.*;

  6. public class SortingTable extends JFrame {

  7. private static final long serialVersionUID=1L;

  8.  
  9. public static void main(String[] args) {

  10. SortingTable frame=new SortingTable();

  11. frame.setVisible(true);

  12. }

  13. public SortingTable() {

  14. setTitle("表格模型与表格");

  15. setBounds(100,100,240,150);

  16. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  17. JScrollPane scrollPane=new JScrollPane();

  18. getContentPane().add(scrollPane,BorderLayout.CENTER);

  19. String[]columnNames= {"A","B"};//定义表格列名数组

  20. String[][]tableValues= {{"A1","B1"},{"A2","B2"},{"A3","B3"}};

  21. //定义表格数据数组

  22. DefaultTableModel tableModel=new DefaultTableModel(tableValues,columnNames);

  23. //创建指定列明和数据的表格

  24. JTable table=new JTable(tableModel);

  25. //创建显示表格的滚动面板

  26. table.setRowSorter(new TableRowSorter<>(tableModel));

  27. //将滚动面板添加到边界布局的中

  28. scrollPane.setViewportView(table);

  29. }

  30. }

 代码图以及运行结果图如下所示:

57a885d75f144d16a7666c335693eb5a.png

18.9.3维护表模型

表格中的数据内容要予以维护,如果使用getValueAt()方法获得表格中的某一俄国单元格的值,使用addRow()方法向表格中添加新的行,使用setValueAt()方法修改表格中的某一个单元格的值removeRow()方法从表格中删除指定行等

以下例题使用了对表格内容进行增删改查如下所示:

 
  1. import java.awt.BorderLayout;

  2. import java.awt.event.ActionEvent;

  3. import java.awt.event.ActionListener;

  4. import java.awt.event.MouseAdapter;

  5. import java.awt.event.MouseEvent;

  6.  
  7. import javax.swing.JButton;

  8. import javax.swing.JFrame;

  9. import javax.swing.JLabel;

  10. import javax.swing.JPanel;

  11. import javax.swing.JScrollPane;

  12. import javax.swing.JTable;

  13. import javax.swing.JTextField;

  14. import javax.swing.ListSelectionModel;

  15. import javax.swing.table.DefaultTableModel;

  16. import javax.swing.table.TableRowSorter;

  17.  
  18. public class AddAndDeleteDemo extends JFrame{

  19. private DefaultTableModel tableModel;

  20. private JTable table;

  21. private JTextField aTextField;

  22. private JTextField bTextField;

  23. public static void main(String[] args) {

  24. AddAndDeleteDemo frame =new AddAndDeleteDemo();

  25. frame.setVisible(true);

  26. }

  27. public AddAndDeleteDemo() {

  28. setTitle("维护表格模型");

  29. setBounds(100,100,520,200);

  30. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  31. final JScrollPane scrollPane =new JScrollPane();

  32. getContentPane().add(scrollPane,BorderLayout.CENTER);

  33. String[] columnNames= {"A","B"};

  34. //定义表格数据数组

  35. String[][] tableValues= {{"A1","B1"},{"A2","B2"},{"A3","B3"}};

  36. //创建指定表格列明和表格数据的表格模型

  37. tableModel =new DefaultTableModel(tableValues,columnNames);

  38. table =new JTable(tableModel);

  39. table.setRowSorter(new TableRowSorter<>(tableModel));

  40. //设置表格的原则模式为单选

  41. table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);

  42. //为表格添加鼠标事件监听器

  43. table.addMouseListener(new MouseAdapter(){

  44. public void mouseClicked(MouseEvent e) {

  45. int selectedRow= table.getSelectedRow();

  46. //从表格模型中获得指定单元格的值

  47. Object oa =tableModel.getValueAt(selectedRow, 0);

  48. //从表格模型中获得指定单元格的值

  49. Object ob =tableModel.getValueAt(selectedRow, 1);

  50. aTextField.setText(oa.toString());

  51. bTextField.setText(ob.toString());

  52. }

  53. });

  54. scrollPane.setViewportView(table);

  55. JPanel panel = new JPanel();

  56. getContentPane().add(panel,BorderLayout.SOUTH);

  57. panel.add(new JLabel("A:"));

  58. aTextField =new JTextField("A14",10);

  59. panel.add(aTextField);

  60. panel.add(new JLabel("B:"));

  61. bTextField=new JTextField("B4",10);

  62. panel.add(bTextField);

  63. JButton addButton =new JButton("添加");

  64. addButton.addActionListener(new ActionListener(){

  65. public void actionPerformed(ActionEvent e) {

  66. String[] rowValues = {aTextField.getText(),

  67. bTextField.getText()};

  68. tableModel.addRow(rowValues);

  69. int rowCount =table.getRowCount()+1;

  70. aTextField.setText("A"+rowCount);

  71. bTextField.setText("B"+rowCount);

  72. }

  73. });

  74. panel.add(addButton);

  75. JButton updButton=new JButton("修改");

  76. updButton.addActionListener(new ActionListener() {

  77. public void actionPerformed(ActionEvent e) {

  78. int selectedRow =table.getSelectedRow();

  79. if(selectedRow !=-1) {

  80. //修改表格模型中的指定值

  81. tableModel.setValueAt(aTextField.getText(), selectedRow, 0);

  82. //修改表格模型中的指定值

  83. tableModel.setValueAt(aTextField.getText(), selectedRow, 1);

  84. }

  85. }

  86. });

  87. panel.add(updButton);

  88. JButton delButton =new JButton("删除");

  89. delButton.addActionListener(new ActionListener() {

  90. public void actionPerformed(ActionEvent e) {

  91. int selecedRow=table.getSelectedRow();

  92. if(selecedRow !=-1)

  93. tableModel.removeRow(selecedRow);

  94. }

  95. });

  96. panel.add(delButton);

  97. }

  98.  
  99. }

  100.  

代码图以及运行结果图如下:

f1b56ac2097d4c73af55f842fe0e3796.png

 18.10ActionEvent动作事件

动作时间(ActionEvent)监听器是Swing中比较常用的事件监听器 很多组件的动作都会使用它监听,如下三种

相关定义实现方式相关定义实现方式
事件名ActionEvent添加监听方法addAtionListener()
事件源JButton,Jlist,STextField等组件删除监听方法reniveActuibListener()
监听接口ActionListener  

下面单击按钮事件例子来说明动作时间监听器,当用户单击按钮时,将触发动作事件 如下立体所示:

代码如下:

 
  1.  
  2. import java.awt.*;

  3. import java.awt.event.ActionEvent;

  4. import java.awt.event.ActionListener;

  5.  
  6. import javax.swing.*;

  7. public class SimpleEvent extends JFrame {

  8. private JButton jb=new JButton("我是按钮,点击我");

  9. public SimpleEvent() {

  10. setLayout(null);

  11. setSize(200,100);

  12. setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

  13. Container cp=getContentPane();

  14. cp.add(jb);

  15. jb.setBounds(10,10,150,30);

  16. jb.addActionListener(new jbAction());

  17.  
  18. setVisible(true);

  19. }

  20. class jbAction implements ActionListener{

  21. public void actionPerformed(ActionEvent arg0) {

  22. jb.setText("我被点击了");

  23. }

  24. }

  25. public static void main(String[] args) {

  26. new SimpleEvent();

  27. }

  28.  
  29. }

 代码图以及运行结果图如下:

35811ddae6d04e33b0980af63c022b3d.png

18.10.2KeyEvent键盘事件

当想文本框中输入内容是,将发生键盘事件,keyEvent类赋值捕获键盘事件,而可以通过为组件添加实现KeyListener接口的监听器类里处理相印的键盘事件  如下三种抽象方法 

 
  1. public inteface KeyListener extends ExventListener{

  2.  
  3. public void ketTyped(KeyEvent e)//发生击键事件时被触发

  4. public void ketPressed(KeyEvent e)//案件被按下按时触发

  5. public void keyReleased(KeyEvent e)}//按键被释放时触发

如下例题所示:

 
  1. textField = new JTextField();

  2. textField.addKeyListener(new KeyAdapter() { // 文本框添加键盘事件的监听

  3. char word;

  4. @Override

  5. public void keyPressed(KeyEvent e) { // 按键被按下时被触发

  6. word = e.getKeyChar();// 获取按下键表示的字符

  7. for (int i = 0; i < btns.size(); i++) {// 遍历存储按键ID的ArrayList集合

  8. // 判断按键是否与遍历到的按键的文本相同

  9. if (String.valueOf(word).equalsIgnoreCase(btns.get(i).getText())) {

  10. btns.get(i).setBackground(green);// 将指定按键颜色设置为绿色

  11. }

  12. }

  13. }

  14. @Override

  15. public void keyReleased(KeyEvent e) { // 按键被释放时被触发

  16. word = e.getKeyChar();// 获取释放键表示的字符

  17. for (int i = 0; i < btns.size(); i++) {// 遍历存储按键ID的ArrayList集合

  18. // 判断按键是否与遍历到的按键的文本相同

  19. if (String.valueOf(word).equalsIgnoreCase(btns.get(i).getText())) {

  20. btns.get(i).setBackground(white);// 将指定按键颜色设置为白色

  21. }

  22. }

  23. }

  24. });

  25. panel.add(textField, BorderLayout.CENTER);

  26. textField.setColumns(10);

  27. }

  28. }

 

代码图以及运行结果图如下:

480ba1459d1c49818a1686cae152daa7.png

 18.10.3MouseEvent鼠标事件

所有组件都能发生鼠标事件MouseEvent类赋值捕捉鼠标事件,可以通过为组件添加了MouseListener接口的监听器类来处理像相应的鼠标事件   如下所示:

 
  1. public inerfacce MouseListener extendx EventListener{

  2. public void mouseEntered(NouseEvent e);//光标一如组件时被触发

  3. public void mousePressed(NouseEvent e)//光标案件被按下触发

  4. public void mouseReleased(NouseEvent e)//鼠标案件被释放时触发

  5. public void mouseClicke(NouseEvent e)//发生单击事件时被触发

  6. public void mouseExited(NouseEvent e)//光标溢出组件时被触发

  7. }

如下例题所示:

 
  1.  
  2. import java.awt.BorderLayout;

  3. import java.awt.event.MouseEvent;

  4. import java.awt.event.MouseListener;

  5.  
  6. import javax.swing.JFrame;

  7. import javax.swing.JLabel;

  8.  
  9. public class MouseEventDemo extends JFrame { // 继承窗体类JFrame

  10.  
  11. public static void main(String args[]) {

  12. MouseEventDemo frame = new MouseEventDemo();

  13. frame.setVisible(true); // 设置窗体可见,默认为不可见

  14. }

  15.  
  16. /**

  17. * 判断按下的鼠标键,并输出相应提示

  18. *

  19. * @param e 鼠标事件

  20. */

  21. private void mouseOper(MouseEvent e) {

  22. int i = e.getButton();

  23. if(i==MouseEvent.BUTTON1)

  24. System.out.println("按下的时鼠标左键");

  25. else if(i==MouseEvent.BUTTON2)

  26. System.out.println("按下的时鼠标滚轮");

  27. else if(i==MouseEvent.BUTTON3)

  28. System.out.println("按下的时鼠标右键");

  29. }

  30.  
  31. public MouseEventDemo() {

  32. super(); // 继承父类的构造方法

  33. setTitle("鼠标事件示例"); // 设置窗体的标题

  34. setBounds(100, 100, 500, 375); // 设置窗体的显示位置及大小

  35. // 设置窗体关闭按钮的动作为退出

  36. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  37.  
  38. final JLabel label = new JLabel();

  39. label.addMouseListener(new MouseListener() {

  40. @Override

  41. public void mouseEntered(MouseEvent e) {

  42.  
  43. System.out.println("光标移入组件");

  44. }

  45.  
  46.  
  47.  
  48. @Override

  49. public void mousePressed(MouseEvent e) {

  50. System.out.println("鼠标按键被按下");

  51. mouseOper(e);

  52. }

  53.  
  54. @Override

  55. public void mouseReleased(MouseEvent e) {

  56. System.out.println("鼠标按键被释放");

  57. mouseOper(e);

  58. }

  59.  
  60. @Override

  61. public void mouseClicked(MouseEvent e) {

  62. System.out.println("单击了鼠标按键");

  63. mouseOper(e);

  64. int clickCount=e.getClickCount();

  65. System.out.println("单机次数为"+clickCount+"下");

  66. }

  67.  
  68. @Override

  69. public void mouseExited(MouseEvent e) {

  70. System.out.println("光标移出组件");

  71.  
  72. }

  73.  
  74. });

  75. getContentPane().add(label, BorderLayout.CENTER);

  76. }

  77.  
  78. }

代码图以及运行结果图:

3fb5c1bb8d064ab793ba9c8caac50ad9.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2659938.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

专题四:前缀和

前缀和 一.一维前缀和(模板)&#xff1a;1.思路一&#xff1a;暴力解法2.思路二&#xff1a;前缀和思路 二. 二维前缀和(模板)&#xff1a;1.思路一&#xff1a;构造前缀和数组 三.寻找数组的中心下标&#xff1a;1.思路一&#xff1a;前缀和 四.除自身以外数组的乘积&#xff…

留言板(Mybatis连接数据库版)

目录 1.添加Mybatis和SQL的依赖 2.建立数据库和需要的表 3.对应表中的字段&#xff0c;补充Java对象 4.对代码进行逻辑分层 5.后端逻辑代码 之前的项目实例【基于Spring MVC的前后端交互案例及应用分层的实现】https://blog.csdn.net/weixin_67793092/article/details/134…

drf知识-08

Django之了解DRF框架 # 介绍&#xff1a;DRF全称 django rest framework # 背景&#xff1a; 在序列化与反序列化时&#xff0c;虽然操作的数据不尽相同&#xff0c;但是执行的过程却是相似的&#xff0c;也就是说这部分代码是可以复用简化编写的 增&#xff1a;校验请…

第三课:寄存器与内存、中央处理器(CPU)、指令和程序及高级 CPU 设计

第三课&#xff1a;寄存器与内存、中央处理器&#xff08;CPU&#xff09;、指令和程序及高级 CPU 设计 第六章&#xff1a;寄存器与内存课程导入1、概念梳理2、锁存器3、门锁4、寄存器5、门锁矩阵5、内存 第七章&#xff1a;中央处理器&#xff08;CPU&#xff09;1、概念梳理…

Illustrator脚本 #015 自动角线

这是一个在画板上自动生成辅助线和角线的脚本,只要单击最右边按钮运行脚本即可。 绿色的为参考线及出血线。 #target "Illustrator" var settings = {addTrim : true,addBleedGuide : true,addCenterGuide : true,addCover : false,overlapAlert : false,trimma…

WEB 3D技术 three.js 设置环境贴图 高光贴图 场景设置 光照贴图

上文WEB 3D技术 three.js 基础网格材质演示几何体贴图 ao贴图效果我们简单构建了一个贴图和ao贴图的几何体材质 我们接下来 来看一下透明度贴图 我们还是官网搜索 MeshBasicMaterial 然后 是我们的 alphaMap 属性 这里 黑色为完全透明 白色 完全不透明 黑白之间还有灰色 这个灰…

【数据库系统概论】第6章-关系数据库理论

真别看吧&#xff0c;抄ppt而已啊 文章目录 6.1 引言6.2 规范化6.2.1 函数依赖6.2.2 码6.2.3 范式&#xff08;Normal Form&#xff09;6.2.4 BC范式6.2.5 规范化小结 6.1 引言 我们有这样一张表&#xff1a; but 为啥这样设计呢&#xff1f;由此引出怎样设计一个关系数据库…

Mac电脑如何长截图?

https://zhuanlan.zhihu.com/p/543012365 1、打开需要截图的网页&#xff08;小编随意输入的内容&#xff09;&#xff0c;如图 2、按下组合快捷键【commandoptioni】&#xff0c;出现“html”界面&#xff0c;如图 3、按下组合快捷键【commandshiftp】&#xff0c;出现搜索界…

使用激光干涉测量时克服振动问题

干涉仪的工作原理 干涉仪可以极其精确地测量物体。他们的工作原理是使用分束器将一束光分成相等的两半&#xff0c;分束器实际上是一块涂有薄银的玻璃。当光照射到分束器上时&#xff0c;一半的光通过&#xff0c;一半的光被反射回来。其中一束光束&#xff08;称为参考光束&a…

软件测试常见的面试题,这些题面试前看提高百分之60的通过率

01、您所熟悉的测试用例设计方法都有哪些&#xff1f;请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答&#xff1a;有黑盒和白盒两种测试种类&#xff0c;黑盒有等价类划分法&#xff0c;边界分析法&#xff0c;因果图法和错误猜测法。白盒有逻辑覆盖法&…

Ubuntu18.04安装GTSAM库并验证GTSAM是否安装成功(亲测可用)

在SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;和SFM&#xff08;Structure from Motion&#xff09;这些复杂的估计问题中&#xff0c;因子图算法以其高效和灵活性而脱颖而出&#xff0c;成为图模型领域的核心技术。GTSAM&#xff08;Georgia Tech Smo…

关于Redis面试题

前言 之前为了准备面试&#xff0c;收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文&#xff1a;https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv Redis 是什么 全名&#xff1a;远程字典服务。这是一个开源的在内存中的数据结构存…

C#高级 01.Net多线程

一.基本概念 1.什么是线程&#xff1f; 线程是操作系统中能独立运行的最小单位&#xff0c;也是程序中能并发执行的一段指令序列线程是进程的一部分&#xff0c;一个进程可以包含多个线程&#xff0c;这些线程共享进程资源进程有线程入口&#xff0c;也可以创建更多的线程 2.…

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…

FreeRTOS学习--59讲 Tickless低功耗

Tickless低功耗作用&#xff1a;降低功耗 配置方法&#xff1a; a.在FreeRTOSConfig.h中将configUSE_TICKLESS_IDLE置1(自动配置tickless函数)&#xff0c;2(手动配置)&#xff0c;0(关闭低功耗) b.在FreeRTOSConfig.h中将configEXPECTED_ID…

【数据结构】插入排序、选择排序、冒泡排序、希尔排序、堆排序

前言&#xff1a;生活中我们总是会碰到各种各样的排序&#xff0c;今天我们就对部分常用的排序进行总结和学习&#xff0c;今天的内容还是相对比较简单的一部分&#xff0c;各位一起加油哦&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f44…

使用Rust发送邮件

SMTP协议与MIME协议 SMTP&#xff08;简单邮件传输协议,Simple Mail Transfer Protocol&#xff09;是一种用于发送和接收电子邮件的互联网标准通信协议。它定义了电子邮件服务器如何相互发送、接收和中继邮件。SMTP 通常用于发送邮件&#xff0c;而邮件的接收通常由 POP&#…

每日一题--------求数字的每⼀位之和

大家好今天的每日一题又来了&#xff0c;有啥不对的请在评论区留言哦 文章目录 目录 文章目录 求数字的每⼀位之和 题⽬描述&#xff1a; 输⼊⼀个整数m&#xff0c;求这个整数m的每⼀位之和&#xff0c;并打印。 一、解题思路 我们可以通过不断获取该整数的个位数&#xff0c…

算法导论复习(七) 动态规划

动态规划一般用来求解最优化问题 设计一个动态规划算法一般有以下四步&#xff1a; 描述一个最优解的结构特征。递归地定义最优解的值。计算最优解的值&#xff0c;通常采用自底向上的方法。利用计算出的信息构造出一个最优解。 钢条切割问题 体现了动态规划的一个重要性质&a…

磁盘管理 :逻辑卷、磁盘配额

一 LVM可操作的对象&#xff1a;①完成的磁盘 ②完整的分区 PV 物理卷 VG 卷组 LV 逻辑卷 二 LVM逻辑卷管理的命令 三 建立LVM逻辑卷管理 虚拟设置-->一致下一步就行-->确认 echo "- - -" > /sys/class/scsi_host/host0/scan;echo "- -…