2020.4.12

一.AWT

AWT是窗口框架,它从不同平台的窗口系统中抽取共同组件,当使用AWT编写图形界面应用时,程序仅指定了界面组件的位置和行为,并为提供真正的实现,JVM 调用操作系统本地的图形界面来创建和平台一直的对等体。

1. java中所有和AWT编程相关的类放在java.awt包以及他的子包中。 AWT中有两个基类:Component和MenuComponent。

Component代表一个以图形化方式显示出来,并可与用户交互的对象;

MenuComponent则代表图形界面菜单组件,包括MenuBar(菜单条),MenuItem(菜单项)等。
    在这里插入图片描述
    2.AWT容器

在AWT中 Container 是一种特殊的Component。它代表一种容器。Container是Component的子类 。容器本身也是一个组件,具有组件的性质。可以调用Component类中的所有方法。

AWT提供了两种主要容器类型

1.Window:可以独立存在的窗口。
2.Panel:可作为容器容纳其他组件,但不能独立存在,必须添加到其他容器中。
3.Frame代表常见的窗口,它是Window类的子类,
4.Frame 对象有标题,允许通过拖拉来改变窗口的位置,大小。
初始化时不可见 ,可用setVisible(true)使其显示出来。
默认使用 BorderLayout作为其布局管理器。
在这里插入图片描述

package AWT1;
import java.awt.Frame;
public class FrameTest {
     public static void main(String[] args) {
          Frame f = new Frame("测试窗口");//标题
          //设置窗口的大小和位置
          f.setLocation(30, 30);
          f.setSize(250, 200);
          //将窗口显示出来(默认隐藏)
          f.setVisible(true);
     }
}

在这里插入图片描述
注意:设置窗口位置的下x,y 是从电脑屏幕的左上角开始。 ps(请问一下我在其他博客上看到的为什么背景是白色的,难道真的是桌面图片是白色?)

如果点击此窗口的右上角的“×”,窗口不会关闭,这是因为该窗口还未编写任何事物响应,可以通过关闭程序命令关闭。

通过Panel作为容器来盛装一个文本框和一个按钮,并将该Panel对象添加到Frame对象中

package AWT1;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextField;
public class FrameTest {
     public static void main(String[] args) {
          Frame f = new Frame("测试窗口");
         //创建一个Panel 容器
         Panel p=new Panel();
          p.add(new TextField(20));//20列,虽然我不知道什么是20列。
          p.add(new Button("单机我"));//按钮上的文字
          //将panel放在frame
         f.add(p);
         f.setBounds(30, 30, 250, 200);
        f.setVisible(true);//默认frame隐藏
 	 }
 }

在这里插入图片描述
ps( TextField(20) 20列是指什么20列 )

ScrollPane 是一个滚动条的容器,它不能独立存在,必须被添加到其他容器。

ScrollPane 特点

1.可作为容器盛装其他组件,当组件占用空间过大时,ScrollPane 自动产生滚动条,当然也可以通过指定特点的构造器参数来指定默认具有滚动条。

2. 不能单独存在,必须放置到其他容器中

3. 默认使用BorderLayout作为其布局管理器。

使用ScrollPane容器来代替Panel容器

public class FrameTest {
    public static void main(String[] args) {
        Frame f = new Frame("测试窗口");
        //创建一个scrollPane 容器,指定总是具有滚动条。
        ScrollPane sp= new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
        //向scrollPane容器中添加两个组件
        sp.add(new TextField(20));
        sp.add(new Button("click"));
        //将scrollPane 容器添加到Frame 对象中
        f.add(sp);
        f.setBounds(30, 30, 250, 200);
        f.setVisible(true);
    }
}

二.Swing

总体介绍
Swing 是一个为Java设计的GUI工具包。Swing是JAVA基础类的一部分。Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。

Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。它们是JFC的一部分。它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意面板。轻量级组件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。

组件(控件)和容器
Swing gui包含了两种元素:组件和容器。它们的区别主要是在概念上的。因为每个容器也都是组件。组件是单独的控制元素,例如按键或者文本编辑框。组件要放到容器中才能显示出来,由于容器也是组件,因此容器也可放到别的容器中。故组件和容器构成了包含层级关系。

组件(控件)
Swing的组件继承于JComponent类。JComponent类提供了所有组件都需要的功能。比如,支持可更换的视觉效果。JComponent继承于AWT的类Component及其子类Container。常见的组件有标签JLabel、按键JButton、输入框JTextField、复选框JCheckBox、列表JList。

容器
容器是一种可以包含组件的特殊组件。Swing中有两大类容器。一类是重量级容器,或者称为顶层容器(top-level container),它们不是继承于JComponent。它们包括JFrame,JApplet,JWindow,JDialog。它们的最大特点是不能被别的容器包含,只能作为界面程序的最顶层容器来包含其它组件。第二类容器是轻量级容器,或者称为中间层容器,它们继承于JComponent,包括JPanel,JScrollPane等。中间层容器用来将若干个相关联的组件放在一起。由于中间层容器继承于JComponent,因此它们本身也是组件,它们可以(也必须)包含在其它的容器中。

Swing的程序界面图
在这里插入图片描述
顶层容器JFrame可独立存在,可被移动,也可被最大化和最小化,有标题栏、边框,可添加菜单栏。中间层容器JPanel不能独立存在,必须包含在另一个容器中。

AWT的类图结构
 在这里插入图片描述

三.Java中Scanner用法总结

ava 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。它是以前的StringTokenizer和Matcher类之间的某种结合。由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分。于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法。这样,除了能使用正则表达式之外,Scanner类还可以任意地对字符串和基本类型(如int和double)的数据进行分析。借助于Scanner,可以针对任何要处理的文本内容编写自定义的语法分析器。

关于nextInt()、next()和nextLine()的理解

nextInt(): it only reads the int value, nextInt() places the cursor(光标) in the same line after reading the input.(nextInt()只读取数值,剩下"\n"还没有读取,并将cursor放在本行中)

next(): read the input only till the space. It can’t read two words separated by space. Also, next() places the cursor in the same line after reading the input.(next()只读空格之前的数据,并且cursor指向本行)
next() 方法遇见第一个有效字符(非空格,非换行符)时,开始扫描,当遇见第一个分隔符或结束符(空格或换行符)时,结束扫描,获取扫描到的内容,即获得第一个扫描到的不含空格、换行符的单个字符串。

nextLine(): reads input including space between the words (that is, it reads till the end of line \n). Once the input is read, nextLine() positions the cursor in the next line.
nextLine()时,则可以扫描到一行内容并作为一个字符串而被获取到。

public class NextTest{  
    public static void main(String[] args) {  
        String s1,s2;  
        Scanner sc=new Scanner(System.in);  
        System.out.print("请输入第一个字符串:");  
        s1=sc.nextLine();  
        System.out.print("请输入第二个字符串:");  
        s2=sc.next();  
        System.out.println("输入的字符串是:"+s1+" "+s2);  
    }  
}  

请输入第一个字符串:home
请输入第二个字符串:work
输入的字符串是:home work
s1=sc.next();  
s2=sc.nextLine();  
请输入第一个字符串:home
请输入第二个字符串:输入的字符串是:hom

可以看到,nextLine()自动读取了被next()去掉的Enter作为他的结束符,所以没办法给s2从键盘输入值。经过验证,我发现其他的next的方法,如double nextDouble() , float nextFloat() , int nextInt() 等与nextLine()连用时都存在这个问题,解决的办法是:在每一个 next()、nextDouble() 、 nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。

public class NextTest{  
    public static void main(String[] args) {  
        String s1,s2;  
        Scanner sc=new Scanner(System.in);  
        System.out.print("请输入第一个字符串:");  
        s1=sc.next();  
        sc.nextLine();
        System.out.print("请输入第二个字符串:");  
        s2=sc.nextLine();  
        System.out.println("输入的字符串是:"+s1+" "+s2);  
    }  
}  

请输入第一个字符串:home
请输入第二个字符串:work
输入的字符串是:home work

循环输入多组测试用例

一个while就是一个测试用例

  public static void main(String[] args){
        Scanner in = new Scanner(System.in);

        // 一个while就是一个测试用例
        while(in.hasNext()){
            int n = in.nextInt(); // 该测试用例后续接收的参数个数
            long[] array = new long[n];
            String[] arrayStr = new String[n];
            for(int i=0; i<n; i++){
                arrayStr[i] = in.next();
            }
            for(int i=0; i<n; i++){
                array[i] = in.nextLong();// 取下一个元素转换成long类型
            }

            System.out.println(Arrays.toString(array)+" "+ Arrays.toString(arrayStr));
        }
    }

一个与容器结合的综合例子:

import java.util.Scanner;    
public class Main {    
    public static void main(String[] args) {    
        Scanner in = new Scanner(System.in);    
        while (in.hasNext()) {    
            int n = in.nextInt();   
        /* nextLine()是扫描器执行当前行,并返回跳过的输入信息,特别需要注意!!! 
 
            如果没有该行,则执行第一个in.nextLine()命令时的返回值是int n = in.nextInt()的值*/   
            in.nextLine();  
        HashSet<String> set = new HashSet<String>();  
        for (int i = 0; i < n; i++) {   
        String line =   
  
        in.nextLine();   
        String[] arr = line.split(" ");   
        for (int j = 0; j < arr.length; j++) {   
            set.add(arr[j]);   
        }  
         }  
        System.out.println("sum:" + set.size());    
    
    }    
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值