高仿QQUI介面
JAVA 程式設計是一個面向物件的過程,要製作簡單的UI介面,首先要了解類與物件的概念,以及啥是面向物件,面向過程。
1.什麼是類、物件
在生活中,要具體說什麼是類,可能很多人都說不出來。一提到類,大多數人想到的都是人類呀,動物類呀以及植物類等等比較抽象的事物。那要如何區分動物類,植物類,人類呢?要區分具體的類要根據類的具體特徵。看是不是符合某個類的特徵。在JAVA中也是一樣,JAVA中,類是指一些擁有共同屬性特徵的物件的集合。在安裝玩jdk後會有一些內建的類不需要我們定義,可以通過引用對應的包使用對應的類物件。那什麼是物件呢?物件指的是一些具體的物體,比如周杰倫呀,這個杯子,讓人能夠清楚知道的具體物體。在java中要使用某個類的方法、屬性必須建立相應的類物件。
2.什麼是面向物件、面向過程
從字面理解,面向就是面對,關注的意思,那麼面向物件就是面對物件、關注物件,關注的重點在物件上,那麼面向過程就是關注的重點在過程上。
3.在設計UI介面時,要了解一些必要的元件的應用,以及簡單的佈局
元件:按鈕(JButton)標籤(JLabel)文字框(JTexField)等等
佈局:流動佈局(FlowLayout)元件從左至右,從上至下排列,當行滿了自動到下一行
邊框佈局(BorderLayout)窗體分為東南西北中五個部分,佈局時指定相應的位置,預設為中。
絕對佈局(null)通過指定固定的座標位置實現元件排列。
等等
在設定好簡單的UI介面後,點選按鈕會沒有反應,那是因為沒有新增監聽器。那什麼是監聽器呢?
4.什麼是監聽器?
java語言中的監聽器相當於現實生活中農的監視器,適用於監視視窗中各元件的活動(比如按鈕的點選、雙擊,視窗的拖動等等,),以便做出各種反應。監聽器:監視器(監視一些事物的動作)
作用:用於監聽窗體上一些元件的動作
使用方式:把一些邏輯(窗體關閉、窗體最小化、窗體移動、按鈕點選等動作)通過事件的觸發來執行
5.有哪些監聽器?
Java當中,監聽器有哪些?監聽器的類如下:
從屬包:java.awt.event包下
監聽器:滑鼠監聽器:MouseListener MouseMotionListener
主要監聽器的是滑鼠的相關動作(按下、釋放、點選、移動、拖動等等)
窗體拖動上、窗體關閉、最小化等等
事件監聽器:ActionListener(監聽事件有沒有觸發),用於按鈕的事件監聽。
鍵盤監聽器:KeyListener
用於接收鍵盤事件(擊鍵)。
6.簡單的UI介面
LoginFrame.java
//引用包
import javax.swing.JFrame;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JOptionPane;
import java.awt.Point;
public class LoginFrame{
public static int x=0,y=0;
public static void main(String[] args){
//1.建立窗體物件JFrame
JFrame jf =new JFrame();
//設定窗體大小
jf.setSize(428,400);
//設定窗體位置
jf.setLocationRelativeTo(null);
//設定窗體預設關閉操作
jf.setDefaultCloseOperation(3);
//去除當前窗體的預設標題欄
jf.setUndecorated(true);
//設定窗體的佈局,為邊框佈局
BorderLayout bl= new BorderLayout();
jf.setLayout(bl);
//往窗體上新增一個面板
JPanel panel = new JPanel();
panel.setBackground(java.awt.Color.white);
jf.add(panel,BorderLayout.CENTER);
//設定panel的絕對佈局
panel.setLayout(null);
//在窗體上放置一個大圖片
ImageIcon image1 = new ImageIcon("image/GIF.gif");
JLabel label = new JLabel(image1);
jf.add(label,BorderLayout.NORTH);
//在窗體底部新增各種元件
ImageIcon imageHead = new ImageIcon("image/head_log.jpg");
JLabel labelHead = new JLabel(imageHead);
//設定圖片的位置
labelHead.setBounds(50,30,80,80);
panel.add(labelHead);
//在下面的面板新增輸入框
JTextField jtf1 = new JTextField();
JTextField jtf2 = new JTextField();
jtf1.setBounds(170,30,180,24);
jtf2.setBounds(170,54,180,24);
panel.add(jtf1);
panel.add(jtf2);
//新增複選框
JCheckBox box1 = new JCheckBox("記住密碼");
JCheckBox box2 = new JCheckBox("自動登入");
box1.setBounds(170,80,80,23);
box2.setBounds(260,80,80,23);
panel.add(box1);
panel.add(box2);
//新增按鈕
JButton button1 = new JButton("登入");
button1.setBackground(java.awt.Color.blue);
button1.setForeground(java.awt.Color.white);
button1.setBorderPainted(false);
button1.setBounds(170,110,180,25);
panel.add(button1);
//新增label
JLabel label1 = new JLabel("註冊賬號");
JLabel label2= new JLabel("找回密碼");
label1.setForeground(java.awt.Color.blue);
label2.setForeground(java.awt.Color.blue);
label1.setBounds(350,30,100,25);
label2.setBounds(350,54,100,25);
panel.add(label1);
panel.add(label2);
//設定窗體可見
jf.setVisible(true);
//新增事件監聽
MouseListener mouse = new MouseListener(){
public void mouseClicked(MouseEvent e){
//實現窗體的點選動作(窗體關閉、最小化)
//確認當前點選的位置(x,y)
int x=e.getX();
int y=e.getY();
if(x>400&&y<20){
//關閉窗體
System.exit(0);
}else if(x>370&&x<400&&y<20){
//設定窗體最小化到工作列
jf.setExtendedState(1);
}else if(x>340&&x<370&&y<20){
new HttpFrame();
//隱蔽登入窗體
jf.dispose();
}
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mousePressed(MouseEvent e){
x = e.getX();
y = e.getY();
}
public void mouseReleased(MouseEvent e){}
};
MouseMotionListener mouseMotion = new MouseMotionListener(){
public void mouseDragged(MouseEvent e){
int mouse_x = e.getX();
int mouse_y = e.getY();
//獲取當前窗體的當前位置,jf來獲取,得到一個點物件
Point point = jf.getLocation();
//獲取當前點的x和y屬性值
int frame_x = (int)point.getX();
int frame_y = (int)point.getY();
jf.setLocation(frame_x+mouse_x-x,frame_y+mouse_y-y);
}
public void mouseMoved(MouseEvent e){}
};
ActionListener action = new ActionListener(){
public void actionPerformed(ActionEvent e){
//獲取文字框的內容
String name = jtf1.getText();
String pwd = jtf2.getText();
if(name.equals("admin")&&pwd.equals("admin")){
//建立窗體物件JFrame
JFrame chatFrame = new JFrame();
chatFrame.setSize(500,500);
chatFrame.setDefaultCloseOperation(3);
chatFrame.setVisible(true);
//隱蔽登入窗體
jf.dispose();
}else{
//彈出提示框
JOptionPane.showMessageDialog(null,"登入失敗");
}
}
};
label.addMouseListener(mouse);
label.addMouseMotionListener(mouseMotion);
button1.addActionListener(action);
}
}
HttpFrame.java設定為流體佈局,顯示較為雜亂
import javax.swing.*;
import java.awt.*;
public class HttpFrame{
HttpFrame(){
//1.建立窗體物件JFrame
JFrame jf =new JFrame();
//構建需要的元件
JComboBox jcb1,jcb2,jcb3;
//初始化
jcb1 = new JComboBox();
jcb1.addItem("不使用代理");
jcb1.addItem("Http代理");
jcb1.addItem("socks5代理");
jcb1.addItem("使用瀏覽器設定");
jcb2 = new JComboBox();
jcb2.addItem("不使用高階設定");
jcb2.addItem("UDP型別");
jcb2.addItem("TCP型別");
jcb3 = new JComboBox();
//新增元件
jf.setLayout(new FlowLayout());
jf.add(new JLabel("網路設定"));
jf.add(new JLabel("型別:"));
jf.add(jcb1);
jf.add(new JLabel("地址:"));
jf.add(new JTextField(8));
jf.add(new JLabel("埠:"));
jf.add(new JTextField(4));
jf.add(new JLabel("使用者名稱:"));
jf.add(new JTextField(10));
jf.add(new JLabel("密碼:"));
jf.add(new JTextField(8));
jf.add(new JLabel("域:"));
jf.add(new JTextField(4));
jf.add(new JButton("測試"));
jf.add(new JLabel("登入伺服器"));
jf.add(new JLabel("型別:"));
jf.add(jcb2);
jf.add(new JLabel("地址:"));
jf.add(jcb3);
jf.add(new JLabel("埠:"));
jf.add(new JTextField(4));
jf.add(new JButton("確定"));
jf.add(new JButton("取消"));
//設定窗體大小
jf.setSize(428,400);
jf.setResizable(false);
//設定窗體位置
jf.setLocationRelativeTo(null);
//設定窗體預設關閉操作
jf.setDefaultCloseOperation(3);
jf.setVisible(true);
}
}