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的更多相关文章

随机推荐

  1. webstorm 常见问题

    1.webstorm(10.0.2)的端口号修改 https://blog.csdn.net/m0_38082783/article/details/71079274 2.导入主题 file –> ...

  2. UGUI 哪些显示在前方的问题

    1.对于一个场景里不同的Canvas来说,越最后创建的或者越最后激活的Canvas,越显示在前方. 2.对于同一个Canvas里的UI来说在Hierarchy面板越靠下越显示在前方.

  3. IntelliJ IDEA里找不到javax.servlet的jar包

    此处有小坑,请注意: https://mvnrepository.com网站查询到的servlet的包的格式为: provided group: 'javax.servlet', name: 'jav ...

  4. 快速创建jquery插件

    介绍 什么是插件? 插件我们见得很多了,比如浏览器上我们会安装一些去除广告的插件.美化页面的插件等等. 在前端,我们也常常写一些jquery插件来使用.来添加我们常常写的一些功能,方便使用. 为什么要 ...

  5. ruby逻辑判断符号

    puts true and false  #相当于 (puts true) and false Use &&/|| for boolean expressions, and/or fo ...

  6. 给用户添加sodu权限

    vim /etc/sudoers 进入编辑模式,找到这一 行:"root ALL=(ALL) ALL"在起下面添加"xxx ALL=(ALL) ALL"(这里的 ...

  7. 利用Serv-U搭建FTP服务器

    以前在学校的时候,学校的整个宿舍楼都是在一个局域网中,经常有人用个人电脑搭个网站或者FTP啊什么的,主要是进行一些影视资源的传播活动.不乏 有些资源充沛的有志青年利用业余时间翻译某岛国影视资源,利用局 ...

  8. 浅入分析Linux

    Linux 操作系统必须完成的两个主要目的 与硬件部分交互, 为包含在硬件平台上的所有底层可编程部件提供服务 为运行在计算机系统上的应用程序(即所谓的用户空间)提供执行环境 一些操作系统运行所有的用户 ...

  9. Snipaste的详细安装和使用

    Snipaste安装和使用 1:snipaste的安装 步骤一: https://zh.snipaste.com/  ,去此官网下载. 步骤二:由于此是个绿色软件,直接解压即可. 步骤三:使用,见官网 ...

  10. RequestMapping的使用

    1.RequestMapping的作用就是 配置url 2.实现功能: 可以在不同的url访问同一个方法.