11_1_GUI
11_1_GUI
1. AWT
AWT(Abstract Window Toolkit)包括了很多类和接口,用于Java Application的GUI(Graphics User Interface 图形用户界面)编程。
GUI的各种元素:(如:窗口,按钮,文本框等)由Java类来实现。
使用AWT所涉及的类一般在java.awt包及其子包中。
Container和Component是AWT中的两个核心类。
2. Component&Container
Java的图形用户界面的最基本组成部分是Component,Component类及其子类的对象用来描述以图形化的方式显示在屏幕上并能与用户进行交互的GUI元素,例如,一个按钮,一个标签等。
一般的Component对象不能独立地显示出来,必须将“放在”某一的Container对象中才可以显示出来。
Container是Component子类,Container子类对象可以”容纳”别的Component对象。
Container对象可使用方法add(..)向其中添加其他Component对象。
Container是Component的子类,因此Container对象也可以当作Component对象添加到其他Container对象中。
有两种常用的Container:
Window:其对象表示自由停泊的顶级窗口
Panel:其对象可作为容纳其他Component对象,但不能独立存在,必须被添加到其他Container中(如Window或Applet)
3. Frame
Frame是Window的子类,由Frame或其子类创建的对象为一个窗体。
Frame的常用构造方法:
Frame()
Frame(String s)创建标题栏为字符串s的窗口。
setBounds(int x, int y, int width, int height)
设置窗体位置和大小,x,y是左上角坐标,width和height是宽度和高度
setSize(int width, int height)
设置窗体的大小,width和height分别是宽度和高度。
setLocation(int x, int y)
设置窗体的位置,x,y是左上角坐标
setBackground(Color c)
设置背景颜色,参数为Collor对象。
setVisible(boolean b)
设置是否可见
setTitle(String name)
设置标题
setResizable(boolean b)
设置是否可以调整大小
3.1创建窗口
TestFrame.java
package Test.GUI;
import java.awt.Color;
import java.awt.Frame;
public class TestFrame {
public static void main(String[] args) {
Frame f = new Frame("我的窗口");
f.setLocation(100, 200);
f.setSize(100, 200);
f.setBackground(Color.blue);
f.setVisible(true);
//不能改变大小
f.setResizable(false);
}
}
TestMultiFrame.java
package Test.GUI;
import java.awt.Color;
import java.awt.Frame;
public class TestMultiFrame {
public static void main(String[] args) {
MyFrame f1 = new MyFrame(100, 100, 200, 200, Color.black);
MyFrame f2 = new MyFrame(300, 100, 200, 200, Color.blue);
MyFrame f3 = new MyFrame(100, 300, 200, 200, Color.red);
MyFrame f4 = new MyFrame(300, 300, 200, 200, Color.CYAN);
}
}
class MyFrame extends Frame {
static int id = 0;
MyFrame(int x, int y, int w, int h, Color color) {
super("MyFrame" + (++id));
setLayout(null);
setBounds(x, y, w, h);
setBackground(color);
setVisible(true);
}
}
4. Panel
Panel对象可以看成可以容纳Component的空间
Panel对象可以拥有自己的布局管理器
Panel类拥有从其父类继承而来的
setBounds(int x, int y, int width, int height)
setSize(int width, int height)
setLocation(int x, int y)
setBackground(Color c)
setLayout(LayoutManager mgr)等方法。
Panel的构造方法为:
Panel()使用默认的FlowLayout类布局管理器初始化。
Panel(LayoutManager layout)使用指定的布局管理器初始化。
4.1创建panel
TestPanel.java
package Test.GUI;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Panel;
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);
}
}
TestMultiPanel.java
package Test.GUI;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Panel;
public class TestMultiPanel {
public static void main(String[] args) {
new MyFrame2("MyFrame With Panel", 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.black);
p2.setBackground(Color.red);
p3.setBackground(Color.gray);
p4.setBackground(Color.blue);
add(p1);
add(p2);
add(p3);
add(p4);
setBounds(x, y, w, h);
setVisible(true);
}
}
CenterPanel.java
package Test.GUI;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Panel;
public class CenterPanel {
public static void main(String[] args) {
new MyFrame3("MyFrame3", 300, 300, 400, 400, Color.blue);
}
}
class MyFrame3 extends Frame {
private Panel p;
MyFrame3(String s, int x, int y, int w, int h, Color color) {
super(s);
setLayout(null);
p = new Panel(null);
p.setBounds(w/4, h/4, w/2, h/2);
p.setBackground(Color.yellow);
add(p);
setBounds(x, y, w, h);
setBackground(color);
setVisible(true);
}
}
5. 布局管理器
Java语言中,提供了布局管理器类的对象可以管理
管理Component在Container中的布局,不必直接设置Component位置和大小。
每个Container都有一个布局管理器对象,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器,调用Container的setLayout方法改变其布局管理器对象。
Awt提供了5种布局管理器:
FlowLayout
BorderLayout
GridLayout
CardLayout
GridBagLayout
5.1FloyLayout布局管理器
FlowLayout是Panel类的默认布局管理器。
FlowLayout布局管理器对组件逐行定位,行内从左到右,一行排满后换行。
不改变组件的大小,按组件原由尺寸显示组件,可设置不同的组件间距,行距以及对齐方式。
FlowLayout布局管理器默认的对齐方式是居中。
5.1.1FlowLayout的构造方法
new FlowLayout(FlowLayout.RIGHT, 20, 40);
右对齐,组件之间水平间距20个像素,垂直间距40个像素。
new FlowLayout(FlowLayout.LEFT);
左对齐,水平和垂直间距为缺省值(5)。
new FlowLayout();
使用默认的居中对齐方式,水平和垂直间距为缺省值(5)。
TestFlowLayout.java
package Test.GUI;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
public class TestFlowLayout {
public static void main(String[] args) {
Frame f = new Frame("FlowLayout");
Button b1 = new Button("ok");
Button b2 = new Button("open");
Button b3 = new Button("close");
f.setLayout(new FlowLayout());
f.add(b1);
f.add(b2);
f.add(b3);
f.setSize(200, 200);
f.setVisible(true);
}
}
TestFlowLayout2.java
package Test.GUI;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
public class TestFlowLayout2 {
public static void main(String[] args) {
Frame f = new Frame("FlowLayout");
FlowLayout l = new FlowLayout(FlowLayout.CENTER, 20, 40);
f.setLayout(l);
f.setBackground(Color.blue);
for (int i = 0; i < 5; i++) {
f.add(new Button("BUTTON"));
}
f.setBounds(200, 200, 600, 800);
f.setVisible(true);
}
}
5.2BorderLayout布局管理器
BorderLayout是Frame类的默认布局管理器。
BorderLayout将整个容器的布局划分成
东(EAST)
西(WEST)
南(SOUTH)
北(NORTH)
中(CENTER)
五个区域,组件只能被添加到指定的区域。
如不指定组件的加入部位,则默认加入到CENTER区。
每个区域只能加入一个组件,如多加人多个,则先前加入的会被覆盖。
5.2.1BorderLayout型布局容器尺寸缩放原则:
北、南两个区域在水平方向缩放。
东、西两个区域在垂直方向缩放。
中部可在两个方向缩放。
TestBorderLayout.java
package Test.GUI;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
public class TestBorderLayout {
public static void main(String[] args) {
Frame f;
f = new Frame("Border Layout");
Button bn = new Button("BN");
Button bs = new Button("BS");
Button bw = new Button("BW");
Button be = new Button("BE");
Button bc = new Button("BC");
f.add(bn, BorderLayout.NORTH);
f.add(bs, BorderLayout.SOUTH);
f.add(bw, BorderLayout.WEST);
f.add(be, BorderLayout.EAST);
f.add(bc, BorderLayout.CENTER);
f.setSize(200, 200);
f.setVisible(true);
}
}
5.3GridLayout布局管理器
GridLayout型布局管理器将空间划分成规则的矩形网络,每个单元格区域大小相等。组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下。
在GridLayout构造方法中指定分隔的行数和列数。
如:GridLayout(3,4)
TestGridLayout.java
package Test.GUI;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
public class TestGridLayout {
public static void main(String[] args) {
Frame f = new Frame("GridLayout");
Button b1 = new Button("b1");
Button b2 = new Button("b2");
Button b3 = new Button("b3");
Button b4 = new Button("b4");
Button b5 = new Button("b5");
Button b6 = new Button("b6");
f.setLayout(new GridLayout(3,2));
f.add(b1);
f.add(b2);
f.add(b3);
f.add(b4);
f.add(b5);
f.add(b6);
f.pack();
f.setVisible(true);
}
}
TenButtons.java
package Test.GUI;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
public class TenButtons {
public static void main(String[] args) {
Frame f = new Frame("Java Frame");
f.setLayout(new GridLayout(2,1));
f.setBounds(300, 400, 300, 200);
f.setBackground(new Color(204, 204, 255));
Panel p1 = new Panel(new BorderLayout());
Panel p2 = new Panel(new BorderLayout());
Panel p11 = new Panel(new GridLayout(2,1));
Panel p21 = new Panel(new GridLayout(2,2));
p1.add(new Button("BUTTON"), BorderLayout.WEST);
p1.add(new Button("BUTTON"), BorderLayout.EAST);
p11.add(new Button("BUTTON"));
p11.add(new Button("BUTTON"));
p1.add(p11, BorderLayout.CENTER);
p2.add(new Button("BUTTON"), BorderLayout.WEST);
p2.add(new Button("BUTTON"), BorderLayout.EAST);
for (int i = 0; i < 4; i++) {
p21.add(new Button("BUTTON"));
}
p2.add(p21, BorderLayout.CENTER);
f.add(p1);
f.add(p2);
f.setVisible(true);
}
}
6. 布局管理器总结
Frame是顶级窗口,Frame的缺省布局管理器为BorderLayout
Panel无法单独显示,必须添加到某个容器中。
Panel的缺省布局管理器为FlowLayout。
当把Panel作为一个组件添加到某个容器中后,该Panel仍然可以有自己的布局管理器。
使用布局管理器时,布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件大小和位置属性,如果试图使用Java语言提供的setLocation(),setSize(),setBounds等方法,则都会被布局管理器覆盖。
如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:
setLayout(null)
7. 事件监听
注册
接到时间对象后进行某种处理
当某种事件发生 向监听器传送某种事件对象(封装了某种事件的信息)
TestActionEvent.java
package Test.GUI;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestActionEvent {
public static void main(String[] args) {
Frame f = new Frame("ActionEvent");
Button b = new Button("Press Me");
Monitor m = new Monitor();
b.addActionListener(m);
f.add(b, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
}
class Monitor implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("事件处理");
}
}
TestActionEvent2.java
package Test.GUI;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestActionEvent2 {
public static void main(String[] args) {
Frame f = new Frame("Test");
Button b1 = new Button("start");
Button b2 = new Button("stop");
Monitor2 m2 = new Monitor2();
b1.addActionListener(m2);
b2.addActionListener(m2);
b2.setActionCommand("Game Over");
f.add(b1, BorderLayout.NORTH);
f.add(b2, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
}
class Monitor2 implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("a button has been pressed," +
"the relative info is:\n" + e.getActionCommand());
}
}
TFActionEvent.java
package Test.GUI;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TFActionEvent {
public static void main(String[] args) {
new TFFrame();
}
}
class TFFrame extends Frame {
public TFFrame() {
TextField tf = new TextField();
add(tf);
tf.addActionListener(new TFActionListener());
pack();
setVisible(true);
}
}
class TFActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
TextField tf = (TextField)e.getSource();
System.out.println(tf.getText());
tf.setText("");
}
}
TFPassword.java
package Test.GUI;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TFPassword {
public static void main(String[] args) {
new TFFrame2();
}
}
class TFFrame2 extends Frame {
public TFFrame2() {
TextField tf = new TextField();
add(tf);
tf.addActionListener(new TFActionListener2());
tf.setEchoChar('*');
pack();
setVisible(true);
}
}
class TFActionListener2 implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
TextField tf = (TextField)e.getSource();
System.out.println(tf.getText());
tf.setText("");
}
}
TFMath.java
package Test.GUI;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TFMath {
public static void main(String[] args) {
new TFFrame3().launchFrame();
}
}
class TFFrame3 extends Frame {
public void launchFrame() {
TextField num1 = new TextField(10);
TextField num2 = new TextField(10);
TextField num3 = new TextField(15);
Label jb = new Label("+");
Button jd = new Button("=");
setLayout(new FlowLayout());
jd.addActionListener(new MyMonitor(num1, num2, num3));
add(num1);
add(jb);
add(num2);
add(jd);
add(num3);
pack();
setVisible(true);
}
}
class MyMonitor implements ActionListener {
public MyMonitor(TextField num1, TextField num2, TextField num3) {
super();
this.num1 = num1;
this.num2 = num2;
this.num3 = num3;
}
TextField num1, num2, num3;
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
num3.setText("" + (n1 + n2));
}
}
TFMath.java
package Test.GUI;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TFMath {
public static void main(String[] args) {
new TFFrame3().launchFrame();
}
}
class TFFrame3 extends Frame {
TextField num1, num2, num3;
public void launchFrame() {
num1 = new TextField(10);
num2 = new TextField(10);
num3 = new TextField(15);
Label jb = new Label("+");
Button jd = new Button("=");
setLayout(new FlowLayout());
jd.addActionListener(new MyMonitor(this));
add(num1);
add(jb);
add(num2);
add(jd);
add(num3);
pack();
setVisible(true);
}
}
class MyMonitor implements ActionListener {
/*public MyMonitor(TextField num1, TextField num2, TextField num3) {
super();
this.num1 = num1;
this.num2 = num2;
this.num3 = num3;
}
TextField num1, num2, num3;*/
TFFrame3 tf = null;
public MyMonitor(TFFrame3 tf) {
this.tf = tf;
}
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(tf.num1.getText());
int n2 = Integer.parseInt(tf.num2.getText());
tf.num3.setText("" + (n1 + n2));
}
}
8. 内部类
好处:
可以方便的访问包装类的成员
可以更清楚的组织逻辑,防止不应该被其他类访问的类进行访问。
何时使用:
该类不允许或不需要其他类进行访问时。
TFMath.java
package Test.GUI;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TFMath {
public static void main(String[] args) {
new TFFrame3().launchFrame();
}
}
class TFFrame3 extends Frame {
TextField num1, num2, num3;
public void launchFrame() {
num1 = new TextField(10);
num2 = new TextField(10);
num3 = new TextField(15);
Label jb = new Label("+");
Button jd = new Button("=");
setLayout(new FlowLayout());
jd.addActionListener(new MyMonitor());
add(num1);
add(jb);
add(num2);
add(jd);
add(num3);
pack();
setVisible(true);
}
class MyMonitor implements ActionListener {
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
num3.setText("" + (n1 + n2));
}
}
}
//class MyMonitor implements ActionListener {
//
// /*public MyMonitor(TextField num1, TextField num2, TextField num3) {
// super();
// this.num1 = num1;
// this.num2 = num2;
// this.num3 = num3;
// }
// TextField num1, num2, num3;*/
// TFFrame3 tf = null;
// public MyMonitor(TFFrame3 tf) {
// this.tf = tf;
// }
// public void actionPerformed(ActionEvent e) {
// int n1 = Integer.parseInt(tf.num1.getText());
// int n2 = Integer.parseInt(tf.num2.getText());
// tf.num3.setText("" + (n1 + n2));
// }
//
//}
9. paint方法
TestPaint.java
package Test.GUI;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
public class TestPaint {
public static void main(String[] args) {
new PaintFrame().launchFrame();
}
}
class PaintFrame extends Frame {
public void launchFrame() {
setBounds(200, 200, 640, 480);
setVisible(true);
}
public void paint(Graphics g) {
Color c = g.getColor();
g.setColor(Color.red);
g.fillOval(50, 50, 30, 30);
g.setColor(Color.green);
g.fillRect(80, 80, 40, 40);
g.setColor(c);
}
}
10.鼠标事件适配器
抽象类java.awt.event.MouseAdapter实现了MouseListener接口,可以使用其子类作为MouseEvent的监听器,只要重写其相应的方法即可。
对于其他的监听器,也有对应的适配器。
使用适配器可以避免监听器类型定义没有必要的空方法。
MyMouseAdapter.java
package Test.GUI;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
public class MyMouseAdapter {
public static void main(String[] args) {
new MyFrame4("drawing");
}
}
class MyFrame4 extends Frame {
ArrayList points = null;
public MyFrame4(String s) {
super(s);
points = new ArrayList();
setLayout(null);
setBounds(300, 300, 400, 400);
setBackground(new Color(204, 204, 255));
setVisible(true);
addMouseListener(new Monitor4());
}
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 Monitor4 extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
MyFrame4 f = (MyFrame4) e.getSource();
f.addPoint(new Point(e.getX(), e.getY()));
f.repaint();
}
}
package Test.GUI;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
public class MyMouseAdapter {
public static void main(String[] args) {
new MyFrame4("drawing");
}
}
class MyFrame4 extends Frame {
ArrayList<Point> points = null;
public MyFrame4(String s) {
super(s);
points = new ArrayList<Point>();
setLayout(null);
setBounds(300, 300, 400, 400);
setBackground(new Color(204, 204, 255));
setVisible(true);
addMouseListener(new Monitor4());
}
public void paint(Graphics g){
Iterator<Point> i = points.iterator();
while (i.hasNext()) {
Point p = i.next();
g.setColor(Color.blue);
g.fillOval(p.x, p.y, 10, 10);
}
}
public void addPoint(Point p) {
points.add(p);
}
}
class Monitor4 extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
MyFrame4 f = (MyFrame4) e.getSource();
f.addPoint(new Point(e.getX(), e.getY()));
f.repaint();
}
}
11匿名类
TestWindowClose.java
package Test.GUI;
import java.awt.Color;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestWindowClose {
public static void main(String[] args) {
new MyFrame5("drawing");
}
}
class MyFrame5 extends Frame {
public MyFrame5(String s) {
super(s);
setLayout(null);
setBounds(300, 300, 400, 400);
setBackground(new Color(204, 204, 255));
setVisible(true);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
setVisible(false);
System.exit(0);
}
});
}
}
TestAnoymous2.java
package Test.GUI;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestAnoymous2 {
public static void main(String[] args) {
new TestAnoymous2();
}
Frame f = new Frame("TestAnoymous2");
TextField tf = new TextField(10);
Button b = new Button("start");
public TestAnoymous2() {
f.add(b, BorderLayout.NORTH);
f.add(tf, BorderLayout.SOUTH);
b.addActionListener(new ActionListener() {
private int i;
@Override
public void actionPerformed(ActionEvent e) {
tf.setText(e.getActionCommand() + (++i));
}
});
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.pack();
f.setVisible(true);
}
}
TestKey.java
package Test.GUI;
import java.awt.Frame;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class TestKey {
public static void main(String[] args) {
new KeyFrame();
}
}
class KeyFrame extends Frame {
public KeyFrame() {
setBounds(200, 200, 300, 300);
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_UP) {
System.out.println("UP");
}
}
});
pack();
setVisible(true);
}
}
11_1_GUI的更多相关文章
随机推荐
- Searching the Web论文阅读
Searching the Web (Arvind Arasu etc.) 1. 概述 2000年,23%网页每天更新,.com域内网页40%每天更新.网页生存半衰期是10天.描述方法可用Pois ...
- python3+Appium自动化12-H5元素定位环境搭建
前言 在混合开发的App中,经常会有内嵌的H5页面.那么这些H5页面元素该如何进行定位操作呢? 针对这种场景直接使用前面所讲的方法来进行定位是行不通的,因为前面的都是基于Andriod原生控件进行元素 ...
- (转)企业级NFS网络文件共享服务
企业级NFS网络文件共享服务 原文:http://www.cnblogs.com/chensiqiqi/archive/2017/03/10/6530859.html --本教学笔记是本人学习和工作生 ...
- (转)shell中test命令方法详解
test命令用法.功能:检查文件和比较值 shell中test命令方法详解 原文:https://www.cnblogs.com/guanyf/p/7553940.html 1)判断表达式 if te ...
- MVC学习手册之数据注解与验证
MVC学习手册之数据注解与验证 新建一个MVC5的WEB应用程序,VS2013会自动生成一段代码,以下是Account控制器下Register.cshtml 页面的代码: @model WebAppl ...
- 2.C#中的常用快捷键
快速对齐代码: Ctrl+K+D: 快速对齐代码 (如果代码语法错误,就不能使用) Ctrl+Z: 撤销 Ctrl+S:保存 没事就Ctrl+S一下,防止因为电脑断电,代码全部丢失 Ctr ...
- Vue之组件间传值
标签: Vue Vue之父子组件传值 父向子传递通过props 子向父传递通过$emit 演示地址 代码示例如下: <!DOCTYPE html> <html lang=" ...
- jQuery 判断文本输入框的事件
1.实现以下需求: 输入框中输入内容,发表按钮变为蓝色背景,删除为空则变为原来的颜色 代码实现:通过判断event.target.value是否为空 2.input事件:文本输入框正在输入时生效 f ...
- canvas剪辑区域
- Android NDK 入门与实践
NDK 是什么 NDK 全称 Native Development Kit,可以让您在 Android 应用中调用 C 或 C++ 代码的工具. NDK 好处 1.NDK 可以生成 .so 文件, 方 ...