`JAVA视频学习笔记-马士兵`
JAVA视频学习笔记(十一)
GUI_初步(20200727)
- GUI(Graphics User Interface 图形用户界面)编程:
图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。图形用户界面由窗口、下拉菜单、对话框及其相应的控制机制构成,在各种新式应用程序中都是标准化的,即相同的操作总是以同样的方式来完成,在图形用户界面,用户看到和操作的都是图形对象,应用的是计算机图形学的技术。 - AWT
Component(组件)和Container(容器)
Window中的子类Frame:
/* 范例名称:Frame 应用举例
* 源文件名称:TestFrame.java
* 要 点:Frame组件的创建及显示设置
*/
import java.awt.*;
public class TestFrame {
public static void main( String args[]) {
Frame f = new Frame("My First Test");
f.setLocation(300, 300);
f.setSize( 170,100);
f.setBackground( Color.blue);
f.setResizable(false);
f.setVisible( true);
}
}
实际应用:
import java.awt.*;
public class TestMultiFrame {
public static void main(String args[]) {
MyFrame f1 =
new MyFrame(100,100,200,200,Color.BLUE);
MyFrame f2 =
new MyFrame(300,100,200,200,Color.YELLOW);
MyFrame f3 =
new MyFrame(100,300,200,200,Color.GREEN);
MyFrame f4 =
new MyFrame(300,300,200,200,Color.MAGENTA);
}
}
class MyFrame extends Frame{
static int id = 0;
MyFrame(int x,int y,int w,int h,Color color){
super("MyFrame " + (++id));
setBackground(color);
setLayout(null);
setBounds(x,y,w,h);
setVisible(true);
}
}
import java.awt.*;
public class TestPanel {
public static void main(String args[]) {
Frame f =
new Frame("Java Frame with Panel");
Panel p = new Panel(null);
f.setLayout(null);
f.setBounds(300,300,500,500);
f.setBackground(new Color(0,0,102));
p.setBounds(50,50,400,400);
p.setBackground(new Color(204,204,255));
f.add(p);
f.setVisible(true);
}
}
实际应用:
import java.awt.*;
public class TestMultiPanel {
public static void main(String args[]) {
new MyFrame2("MyFrameWithPanel",300,300,400,300);
}
}
class MyFrame2 extends Frame{
private Panel p1,p2,p3,p4;
MyFrame2(String s,int x,int y,int w,int h){
super(s);
setLayout(null);
p1 = new Panel(null); p2 = new Panel(null);
p3 = new Panel(null); p4 = new Panel(null);
p1.setBounds(0,0,w/2,h/2);
p2.setBounds(0,h/2,w/2,h/2);
p3.setBounds(w/2,0,w/2,h/2);
p4.setBounds(w/2,h/2,w/2,h/2);
p1.setBackground(Color.BLUE);
p2.setBackground(Color.GREEN);
p3.setBackground(Color.YELLOW);
p4.setBackground(Color.MAGENTA);
add(p1);add(p2);add(p3);add(p4);
setBounds(x,y,w,h);
setVisible(true);
}
}
设计一个含有Panel的自定义的Frame类,形式如下图:
具体代码:
import java.awt.*;
public class CenterPanel {
public static void main(String args[]) {
new MyFrame3(300,300,400,300,Color.BLUE);
}
}
class MyFrame3 extends Frame{
private Panel p;
MyFrame3(int x,int y,int w,int h,Color c){
super("FrameWithPanel");
setLayout(null);
setBounds(x,y,w,h);
setBackground(c);
p = new Panel(null);
p.setBounds(w/4,h/4,w/2,h/2);
p.setBackground(Color.YELLOW);
add(p);
setVisible(true);
}
}
GUI_布局管理器(20200728)
- 布局管理器
默认的布局管理器:
用法举例:
/* 范例名称:FlowLayout 用法举例
* 源文件名称:TestFlowLayout.java
* 要 点:
* 1. 布局管理器的概念和作用
* 2. FlowLayout的性质及用法
*/
import java.awt.*;
public class TestFlowLayout {
public static void main(String args[]) {
Frame f = new Frame("Flow Layout");
Button button1 = new Button("Ok");
Button button2 = new Button("Open");
Button button3 = new Button("Close");
f.setLayout(new FlowLayout(FlowLayout.LEFT));
f.add(button1);
f.add(button2);
f.add(button3);
f.setSize(100,100);
f.setVisible(true);
}
}
GUI_事件模型(20200729)
- 事件监听:
先看程序:
/* 范例名称:Java事件处理举例
* 源文件名称:TestActionEvent.java
* 要 点:
* 1. Java事件处理机制
* 2. 事件源、事件监听器概念及作用
* 3. 如何在一个现有组件上注册监听器
*/
import java.awt.*;
import java.awt.event.*;
public class TestActionEvent {
public static void main(String args[]) {
Frame f = new Frame("Test");
Button b = new Button("Press Me!");
Monitor bh = new Monitor();
b.addActionListener(bh);
f.add(b,BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
}
class Monitor implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("a button has been pressed");
}
}
GUI_持有对方引用(20200730)
- 持有对方引用:
做一个做加法的图形界面:
不用持有对方引用的写法:
import java.awt.*;
import java.awt.event.*;
public class TFMath {
public static void main(String[] args) {
new TFFrame().launchFrame();
}
}
class TFFrame extends Frame {
TextField num1,num2,num3;
public void launchFrame() {
num1 = new TextField(10);//宽度为10的文本框
num2 = new TextField(10);
num3 = new TextField(15);
Label labPlus = new Label("+");//加号这其实就是个静态文本,这个类就是个静态的文本
Button butEqual = new Button("=");
butEqual.addActionListener(new MyMonitor(num1,num2,num3));
setLayout(new FlowLayout());
add(num1);
add(labPlus);
add(num2);
add(butEqual);
add(num3);
pack();
setVisible(true);
}
}
class MyMonitor implements ActionListener {
TextField num1,num2,num3;
public MyMonitor(TextField num1,TextField num2,TextField num3) {//创造一个构造方法来获得三个文本框的信息(引用)
this.num1 = num1;
this.num2 = num2;
this.num3 = num3;
}
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
num3.setText(""+ (n1+n2));
}
}
持有引用类的:
import java.awt.*;
import java.awt.event.*;
public class TFMath {
public static void main(String[] args) {
new TFFrame().launchFrame();
}
}
class TFFrame extends Frame {
TextField num1,num2,num3;
public void launchFrame() {
num1 = new TextField(10);//宽度为10的文本框
num2 = new TextField(10);
num3 = new TextField(15);
Label labPlus = new Label("+");//加号这其实就是个静态文本,这个类就是个静态的文本
Button butEqual = new Button("=");
butEqual.addActionListener(new MyMonitor(this));//把自己这个对象交给监视器
setLayout(new FlowLayout());
add(num1);
add(labPlus);
add(num2);
add(butEqual);
add(num3);
pack();
setVisible(true);
}
}
class MyMonitor implements ActionListener {
TFFrame tff = null;//直接持有框架这个类的引用
public MyMonitor(TFFrame tff) {
this.tff = tff;
}
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(tff.num1.getText());
int n2 = Integer.parseInt(tff.num2.getText());
tff.num3.setText(""+ (n1+n2));
}
}
更简洁的方法:
import java.awt.*;
import java.awt.event.*;
public class TFMath2 {
public static void main(String[] args) {
new TFFrame().launchFrame();
}
}
class TFFrame extends Frame {
TextField num1,num2,num3;
public void launchFrame() {
num1 = new TextField(10);//宽度为10的文本框
num2 = new TextField(10);
num3 = new TextField(15);
Label labPlus = new Label("+");//加号这其实就是个静态文本,这个类就是个静态的文本
Button butEqual = new Button("=");
butEqual.addActionListener(new MyMonitor());
setLayout(new FlowLayout());
add(num1);
add(labPlus);
add(num2);
add(butEqual);
add(num3);
pack();
setVisible(true);
}
private class MyMonitor implements ActionListener { //内部类
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(num1.getText());//可以方便地访问TFFrame的成员变量
int n2 = Integer.parseInt(num2.getText());
num3.setText(""+ (n1+n2));
}
}
}
GUI_内部类(20200731)
- 内部类:
GUI_Paint方法(20200801)
- Paint方法:
Component 类提供了两个和绘图相关的方法:
a. paint(Graphics g); 绘制组件的外观
b. repaint(); 刷新组件的外观。
当组件第一次在屏幕显示的时候,程序会自动调用paint来绘制组件。
GUI_Adapter_and_repaint(20200802)
- Adapter_and_repaint:
// MyMouseAdapter.java
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class MyMouseAdapter {
public static void main(String args[]) {
new JinFrame("drawing....");
}
}
class JinFrame extends Frame {
ArrayList points = null;
JinFrame(String s) {
super(s);
points = new ArrayList();
setLayout(null);
setBounds(300, 300, 400, 300);
this.setBackground(new Color(204, 204, 255));
setVisible(true);
this.addMouseListener(new Monitor());
}
public void paint(Graphics g) {
Iterator i = points.iterator();
while(i.hasNext()) {
Point p = (Point) i.next();
g.setColor(Color.BLUE);
g.fillOval(p.x, p.y, 10, 10);
}
}
public void addPoint(Point p) {
points.add(p);
}
}
class Monitor extends MouseAdapter {
public void mousePressed(MouseEvent e) {
JinFrame f = (JinFrame) e.getSource();
f.addPoint(new Point(e.getX(), e.getY()));
f.repaint();
}
}
GUI_KeyEvent(20200803)
- Window事件:
- KeyEvent:
import java.awt.*;
import java.awt.event.*;
public class TestKey {
public static void main(String[] args) {
new KeyFrame().launchFrame();
}
}
class KeyFrame extends Frame {
public void launchFrame() {
setSize(200, 200);
setLocation(300,300);
addKeyListener(new MyKeyMonitor());
setVisible(true);
}
class MyKeyMonitor extends KeyAdapter {
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_UP) {
System.out.println("UP");
}
}
}
}