常用组件
标签(JLabel):标签是容纳文本和图标的控件,通常用来在界面中标识别的控件。 构造函数: JLabel() 创建一个空的标签 JLabel(String text) 创建一个带文本的标签 JLabel(Icon image) 创建一个带图像的标签 方法: void setText(String text) 设置标签上的文本 String getText() 获得标签上的文本 setFont(new Font(“宋体”,Font.BOLD, 18)); 设置字体
单行文本(JTextField) JTextField的构造函数: JTextField() JTextField(String text ) JTextField(int columns) JTextField(String text, int columns) 方法: void setText(String text) 设置文本框中的文本 String getText() 获得文本框中的文本 void setEditable(boolean b) 设置文本框是否可以编辑 setColumns(20); 设置列数
多行文本框(JTextArea) 构造函数: JTextArea() 创建一个空的文本域 JTextArea(String text) 用指定文本初始化文本域 JTextArea(int rows, int columns) 创建一个指定行数和列数的空文本域 JTextArea(String text,int rows, int columns) 创建一个带文本,并指行数和列数的 方法: void setText(String text) 设置文本域中的文本 String getText() 获得文本域中的文本 void setFont(Font font) 设置文本域中文本的字体 void setLineWrap(boolean wrap) //是否自动换行,默认false 如果需要文本区自动出现滚动条,可将文本区对象放入滚动窗格(JScrollPane)中: JScrollPane scrollPane = new JScrollPane(txtArea); add(scrollPane )
密码框(JPasswordField) 构造函数: JPasswordField() JPasswordField(String text) JPasswordField(String text, int columns) 方法: char[] getPassword()
按钮(JButton) 构造方法: JButton(String text) 创建一个带文本的标签 JButton(Icon image) 创建一个带图像的标签 方法: void setBackground(Color bg) 设置按钮的背景色 void setEnabled(boolean b) 设置启用(或禁用)按钮,由参数b决定 void setToolTipText(String text) 设置按钮的悬停提示信息
菜单栏组件: 构造方法:JMenuBar(); 方法:add(menu); 向菜单栏添加菜单 菜单组件: 构造方法:JMenu(“菜单名称"); 方法:add(menuItem); 向菜单添加菜单选项 菜单项组件: 构造方法:JMenuItem(“菜单项名称"); 将菜单栏添加到窗口 setJMenuBar(menuBar);
/* JFrame 窗口 JPanel 面板 布局 流式布局 边界 网格布局 JTextField 单行文本输入框 JLabel 标签 JPasswordField 密码框组件 JButton 按钮 JTextArea 多行文本输入框 文本域 JScrollPane 滚动面板 */ public class Demo5Frame extends JFrame{ public Demo5Frame() throws HeadlessException { this.setTitle("窗口标题"); this.setSize(500, 500);//大小 this.setLocationRelativeTo(null);//相对位置 水平垂直居中 this.setResizable(false);//禁止设置窗口大小 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项 this.setLayout(null);//通过坐标定位 JButton jb=new JButton("登录"); jb.setSize(100, 30);//为组件设置大小 jb.setLocation(110, 100);//设置组件在窗口内的位置 JPanel jp = new JPanel(); JTextArea jt = new JTextArea(10,20);//多行文本 jt.setLineWrap(true); jt.setWrapStyleWord(true); JScrollPane jsp = new JScrollPane(jt); jp.add(jsp); //this--窗口 this.add(jp); this.add(jb); this.setVisible(true);//显示窗口,最后让窗口显示 } public static void main(String[] args) { new Demo5Frame(); }} //菜单有三部分构成,菜单栏 ,菜单,菜单项 JPanel jp = new JPanel(); JMenuBar jMenuBar = new JMenuBar(); JMenu jMenu1 = new JMenu("文件"); JMenuItem ji1 = new JMenuItem("新建"); JMenuItem ji2 = new JMenuItem("保存"); jMenu1.add(ji1); jMenu1.add(ji2); JMenu jMenu2 = new JMenu("编辑"); JMenuItem ji3 = new JMenuItem("剪切"); JMenuItem ji4 = new JMenuItem("复制"); jMenu2.add(ji3); jMenu2.add(ji4); JMenu jMenu3 = new JMenu("帮助"); JMenuItem ji5 = new JMenuItem("关于"); jMenu3.add(ji5); jMenuBar.add(jMenu1); jMenuBar.add(jMenu2); jMenuBar.add(jMenu3); this.setJMenuBar(jMenuBar);//添加菜单栏 this.add(jp); this.setVisible(true);//显示窗口,最后让窗口显示
事件处理
对于采用了图形用户界面的程序来说,事件控制是非常重要的;到目前为止,我们编写的图形用户界面程序都仅仅只是完成了界面,而没有任何实际的功能,要实现相应的功能,必须进行事件处理; 用户与GUI组件进行交互就会发生事件,如:按下一个按钮、用键盘输入一个字符、点击鼠标等等; 当前我们要关注的并不是“事件是如何产生的”,而是讨论当发生事件后,我们应当“如何处理之” Java中,事件处理的基本思路如下: 一个源(事件源)产生一个事件(事件对象)并把它送到监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接受,监听器将处理这些事件; 一个事件源必须注册监听器以便监听器可以接受关于一个特定事件的通知。 由于我们想要处理按钮的点击事件,因此,按钮便是事件源;监听器类型是ActionListener。 添加事件监听器(此处即为匿名类): 按钮对象.addActionListener(new ActionListener() { // 事件处理 @Override public void actionPerformed(ActionEvent e) {执行操作}});
public class Demo9Frame extends JFrame{ JTextField accountText; public Demo9Frame() throws HeadlessException { this.setTitle("窗口标题"); this.setSize(500, 500);//大小 //this.setLocation(300, 500);//位置坐标 this.setLocationRelativeTo(null);//相对位置 水平垂直居中 this.setResizable(false);//禁止设置窗口大小 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项 JPanel jp = new JPanel(); JLabel label = new JLabel("账号"); label.setForeground(Color.blue); label.setFont(new Font("楷体", Font.BOLD,20)); accountText = new JTextField(15); JButton jb = new JButton("登录"); jp.add(label); jp.add(accountText); jp.add(jb); //this--窗口 this.add(jp); this.setVisible(true);//显示窗口,最后让窗口显示 //为登录按钮注册时间监听器 创建ActionListener的匿名内部类对象 1 /*jb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println(accountText.getText()); } });*/ 2 /* jb.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { System.out.println("鼠标点击"); } }); accountText.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { System.out.println(accountText.getText()); System.out.println(e.getKeyChar()+":"+e.getKeyCode()); } });*/ // 为了简化内部类的定义,可以使用匿名内部类方式简化语法只是使用一次 3 /* accountText.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { } });*/ //jb.addActionListener(new MyAction()); } //将只在本类中使用的功能,定义在内部类中,实现封装,在哪儿使用,new 内部类即可 class MyAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { System.out.println("被点击了"); System.out.println(accountText.getText());//使用外部类的成员 } } public static void main(String[] args) { new Demo9Frame(); }}
对话框
JOptionPane对话框; showMessageDialog():消息对话框主要有五种消息类型,类型不同,图标不同: 1.ERROR_MESSAGE 错误消息提示 2.INFORMATION_MESSAGE 信息提示 3.WARNING_MESSAGE 警告提示 4.QUESTION_MESSAGE 问题提示 5.PLAIN_MESSAGE 简洁提示 showConfirmDialog():确认对话框主要有四种消息类型,类型不同,图标不同: 1.DEFAULT_OPTION 默认选项 2.YES_NO_OPTION 是/否选项 3.YES_NO_CANCEL_OPTION 是/否/取消选项 4.OK_CANCEL_OPTION 确定/取
public class Demo10Frame extends JFrame{ JTextField accountText; public Demo10Frame() throws HeadlessException { this.setTitle("窗口标题"); this.setSize(500, 500);//大小 //this.setLocation(300, 500);//位置坐标 this.setLocationRelativeTo(null);//相对位置 水平垂直居中 this.setResizable(false);//禁止设置窗口大小 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项 JPanel jp = new JPanel(); JLabel label = new JLabel("账号"); label.setForeground(Color.blue); label.setFont(new Font("楷体", Font.BOLD,20)); accountText = new JTextField(15); JButton jb = new JButton("登录"); jp.add(label); jp.add(accountText); jp.add(jb); //this--窗口 this.add(jp); this.setVisible(true);//显示窗口,最后让窗口显示 //注意()位置范围 jb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String account = accountText.getText(); if(account.length()>10){ //System.out.println("账号不能大于10位字符!"); //JOptionPane.showMessageDialog(null, "账号不能大于10位字符!"); //JOptionPane.showMessageDialog(null, "账号不能大于10位字符!","登录提示",JOptionPane.QUESTION_MESSAGE); int res = JOptionPane.showConfirmDialog(null, "您确定要退出吗?", "操作提示", JOptionPane.OK_CANCEL_OPTION); System.out.println(res); if(res==0){ dispose(); } return; } } }); } public static void main(String[] args) { new Demo10Frame(); }}
内部类
内部类有哪些 : 成员内部类,静态内部,局部内部类,匿名内部类 内部的意义: 封装性,隐藏起来,外界不知道 ,间接实现多继承
什么是内部类
把类定义在另一个类的内部,该类就被称为内部类。如果在类 Outer 的内部再定义一个类 Inner,此时类 Inner 就称为内部类(或称为嵌套类),而类 Outer 则称为外部类(或称为宿主类)。
内部类的分类
内部类一般来说包括这四种:1.成员内部类 2.静态内部类 3.局部内部类 4.匿名内部类
1.成员内部类 成员内部类——就是位于外部类成员位置的类 特点:可以使用外部类中所有的成员变量和成员方法(包括private的) class Outer { private int age = 20; class Inner { public void show() { System.out.println(age);}}} private修饰内部类 如果我们的内部类不想轻易被任何人访问,可以选择使用private修饰内部类,这样我们就无法通过创建对象的方法来访问,想要访问只需要在外部类中定义一个public修饰的方法,间接调用。这样做的好处就是,我们可以在这个public方法 中增加一些判断语句,起到数据安全的作用。 class Outer { private class Inner { public void show() { System.out.println(“密码备份文件”);}} //使用getXxx()获取成员内部类,可以增加校验语句(文中省略) public Inner getInner() { return new Inner();}} public static void main(String[] args) { Outer outer = new Outer(); Outer.Inner inner = outer.getInner(); inner.show();}
2.静态内部类 这种被 static 所修饰的内部类,按位置分,属于成员内部类,但也可以称作静态内部类,也常叫做嵌套内部类.不能使用外部类的非static成员变量和成员方法 public class Outter { int age = 10; static int age2 = 20; public Outter() {} static class Inner { public void method() { System.out.println(age);//错误 System.out.println(age2);//正确}}}
3.局部内部类 局部内部类——就是定义在一个方法或者一个作用域里面的类 特点:主要是作用域发生了变化,只能在自身所在方法和属性中被使用 class Outer { private int age = 2 0 ; public void method () { final int age2 = 30 ; class Inner { public void show () { System.out.println ( age ); / /从内部类中访问方法内变量age2,需要将变量声明为最终类型。 System.out.println ( age2 );}} Inner i = new Inner(); i.show ();
4.匿名内部类 一个没有名字的类,是内部类的简化写法 interface Inner { public abstract void show(); } class Outer { public void method(){ new Inner() { public void show() { System.out.println("HelloWorld");} }. show();}}
public class Outer { private int num = 10; private static int num1 = 10; public void eat(){ new Inner();//一般在本类中使用内部类 } //在一个类的内部定义的类称为内部类 //静态内部类, 只能方访问外部类中静态成员 static class Inner{ public void test(){ System.out.println(num1);//在内部类中可以直接使用外部类中的成员,即使是私有的. } } public static void main(String[] args) { } }
内部类的特点
1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。 2.内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否为 private 的。 3.内部类声明成静态的,就不能随便访问外部类的成员变量,仍然是只能访问外部类的静态成员变量
内部类的意义
1.封装性 作为一个类的编写者,我们很显然需要对这个类的使用访问者的访问权限做出一 定的限制,我们需要将一些我们不愿意让别人看到的操作隐藏起来.
2.实现多继承
public class Car { private int num; private String name; public Car(int num, String name) { this.num = num; this.name = name; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Car{" + "num=" + num + ", name='" + name + '\'' + '}'; }} public class TestCar { public static void main(String[] args) { Car car1 = new Car(101, "car1"); Car car2 = new Car(102, "car2"); Car car3 = new Car(103, "car3"); Car car4 = new Car(104, "car4"); Car [] cars = {car2,car1,car4,car3}; //Arrays.sort(cars,new CarComparator()); Arrays.sort(cars, new Comparator<Car>() { @Override public int compare(Car o1, Car o2) { return o1.getNum()-o2.getNum(); } }); Arrays.sort(cars,(o1,o2)->{ return o1.getNum()-o2.getNum(); }); System.out.println(Arrays.toString(cars)); ArrayList<Car> carArrayList = new ArrayList<>(); carArrayList.add(car2); carArrayList.add(car1); carArrayList.add(car4); carArrayList.add(car3); carArrayList.sort(new Comparator<Car>() { @Override public int compare(Car o1, Car o2) { return o1.getNum()-o2.getNum(); } }); }}