1. java入門之Swing如何監聽用戶動作
方法/步驟
步驟一 : 構建一個窗口程序
我們先創建一個窗口程序,其中有兩個按鈕,目前這兩個按鈕單擊沒有任何反應!窗口目前沒有監聽我們的動作,也不會對我們的動作給出響應。
關於如何創建一個窗口程序,大家可以參考如下經驗 :
0JAVA入門之如何使用Swing實現第一個窗口應用
步驟二 : 創建按鈕的事件監聽類
Swing事件監聽介面和基類全部都在包 "java.awt.event" 中!對於按鈕控制項而言,其單擊事件監聽介面是 "java.awt.event.ActionListener"。 我們創建的事件監聽類要實現這個事件監聽介面,並重寫其中的方法 "actionPerformed" 方法 !
具體代碼為 :
// 按鈕單擊的事件監聽類必須繼承 java.awt.event.ActionListener 介面
public class BtnListener implements ActionListener {
// 表示我們單擊了哪個按鈕
private JButton theBtn;
// 默認構造函數
public BtnListener(){
super();
}
// 自定義構造函數,接受一個按鈕控制項,指示我們單擊的具體那個按鈕
// 你可以自定義任何構造函數,從外部接受你所需要的信息!
public BtnListener(JButton theBtn){
this();
this.theBtn = theBtn;
}
// 覆寫介面中的方法 : actionPerformed
@Override
public void actionPerformed(ActionEvent e) {
// 按鈕的 getText 方法返回按鈕上顯示的文字
String info = "你單擊了按鈕 : " + theBtn.getText();
JOptionPane.showMessageDialog(null, info , "單擊按鈕提示框",
JOptionPane.INFORMATION_MESSAGE);
}
}
2. 3 分鍾生成一個單元測試報告,這個樣式愛了
3分鍾內,讓你的單元測試報告煥然一新!
在日常開發中,介面測試是不可或缺的環節。當面對特殊場景,如超時測試,TestNG以其強大功能脫穎而出,它以最小執行單元的@Test註解為基石,輔以細致的分組管理,讓測試更加靈活。
要搭建TestNG框架,關鍵依賴包括Spring-boot-starter-test、TestNG和extentreports。TestNG支持註解執行和XML配置,比如,你可以使用@Data註解輕松提供參數數據,@Test方法則根據參數執行查詢User的復雜操作,並在特殊場景下進行斷言,確保代碼質量。
使用TestNG,你可以選擇註解方式直接運行測試方法,或者通過XML配置文件進行細致的測試流程管理。例如,通過以下XML結構運行測試套件:
為了生成定製化的測試報告,自定義監聽器ExtentTestNGIReporterListener派上用場。在測試執行過程中,它會動態展示自定義數據,如執行結果的統計信息。
Listener初始化並處理測試結果,通過統計測試用例的成功suitePassSize、失敗suiteFailSize和跳過suiteSkipSize,構建出層次分明的報告結構。在多套測試suite情況下,它會智能地在SuiteResult中創建相應節點,確保報告的清晰度和可讀性。
總的來說,TestNG和自定義報告監聽器的組合,讓你能在短短3分鍾內生成一份既美觀又實用的單元測試報告,極大地提高了測試效率。這不僅是技術實力的體現,也是對項目質量把控的有力保障。
想要了解更多細節和實踐技巧,讓我們一起探索更多TestNG的奧秘吧!
3. 如何使用java socket來傳輸自定義的數據包
以下分四點進行描述:
1,什麼是Socket
網路上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現客戶方和服務方的連接。Socket是TCP/IP協議的一個十分流行的編程界面,一個Socket由一個IP地址和一個埠號唯一確定。
但是,Socket所支持的協議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯系的。在Java環境下,Socket編程主要是指基於TCP/IP協議的網路編程。
2,Socket通訊的過程
Server端Listen(監聽)某個埠是否有連接請求,Client端向Server 端發出Connect(連接)請求,Server端向Client端發回Accept(接受)消息。一個連接就建立起來了。Server端和Client 端都可以通過Send,Write等方法與對方通信。
對於一個功能齊全的Socket,都要包含以下基本結構,其工作過程包含以下四個基本的步驟:
(1) 創建Socket;
(2) 打開連接到Socket的輸入/出流;
(3) 按照一定的協議對Socket進行讀/寫操作;
(4) 關閉Socket.(在實際應用中,並未使用到顯示的close,雖然很多文章都推薦如此,不過在我的程序中,可能因為程序本身比較簡單,要求不高,所以並未造成什麼影響。)
3,創建Socket
創建Socket
java在包java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務端。這是兩個封裝得非常好的類,使用很方便。其構造方法如下:
Socket(InetAddress address, int port);
Socket(InetAddress address, int port, boolean stream);
Socket(String host, int prot);
Socket(String host, int prot, boolean stream);
Socket(SocketImpl impl)
Socket(String host, int port, InetAddress localAddr, int localPort)
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
ServerSocket(int port);
ServerSocket(int port, int backlog);
ServerSocket(int port, int backlog, InetAddress bindAddr)
其中address、host和port分別是雙向連接中另一方的IP地址、主機名和端 口號,stream指明socket是流socket還是數據報socket,localPort表示本地主機的埠號,localAddr和 bindAddr是本地機器的地址(ServerSocket的主機地址),impl是socket的父類,既可以用來創建serverSocket又可 以用來創建Socket。count則表示服務端所能支持的最大連接數。例如:學習視頻網 http://www.xxspw.com
Socket client = new Socket("127.0.01.", 80);
ServerSocket server = new ServerSocket(80);
注意,在選擇埠時,必須小心。每一個埠提供一種特定的服務,只有給出正確的埠,才 能獲得相應的服務。0~1023的埠號為系統所保留,例如http服務的埠號為80,telnet服務的埠號為21,ftp服務的埠號為23, 所以我們在選擇埠號時,最好選擇一個大於1023的數以防止發生沖突。
在創建socket時如果發生錯誤,將產生IOException,在程序中必須對之作出處理。所以在創建Socket或ServerSocket是必須捕獲或拋出例外。
4,簡單的Client/Server程序
1. 客戶端程序
import java.io.*;
import java.net.*;
public class TalkClient {
public static void main(String args[]) {
try{
Socket socket=new Socket("127.0.0.1",4700);
//向本機的4700埠發出客戶請求
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系統標准輸入設備構造BufferedReader對象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//由Socket對象得到輸出流,並構造PrintWriter對象
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket對象得到輸入流,並構造相應的BufferedReader對象
String readline;
readline=sin.readLine(); //從系統標准輸入讀入一字元串
while(!readline.equals("bye")){
//若從標准輸入讀入的字元串為 "bye"則停止循環
os.println(readline);
//將從系統標准輸入讀入的字元串輸出到Server
os.flush();
//刷新輸出流,使Server馬上收到該字元串
System.out.println("Client:"+readline);
//在系統標准輸出上列印讀入的字元串
System.out.println("Server:"+is.readLine());
//從Server讀入一字元串,並列印到標准輸出上
readline=sin.readLine(); //從系統標准輸入讀入一字元串
} //繼續循環
os.close(); //關閉Socket輸出流
is.close(); //關閉Socket輸入流
socket.close(); //關閉Socket
}catch(Exception e) {
System.out.println("Error"+e); //出錯,則列印出錯信息
}
}
}
2. 伺服器端程序
import java.io.*;
import java.net.*;
import java.applet.Applet;
public class TalkServer{
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
//創建一個ServerSocket在埠4700監聽客戶請求
}catch(Exception e) {
System.out.println("can not listen to:"+e);
//出錯,列印出錯信息
}
Socket socket=null;
try{
socket=server.accept();
//使用accept()阻塞等待客戶請求,有客戶
//請求到來則產生一個Socket對象,並繼續執行
}catch(Exception e) {
System.out.println("Error."+e);
//出錯,列印出錯信息
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket對象得到輸入流,並構造相應的BufferedReader對象
PrintWriter os=newPrintWriter(socket.getOutputStream());
//由Socket對象得到輸出流,並構造PrintWriter對象
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系統標准輸入設備構造BufferedReader對象
System.out.println("Client:"+is.readLine());
//在標准輸出上列印從客戶端讀入的字元串
line=sin.readLine();
//從標准輸入讀入一字元串
while(!line.equals("bye")){
//如果該字元串為 "bye",則停止循環
os.println(line);
//向客戶端輸出該字元串
os.flush();
//刷新輸出流,使Client馬上收到該字元串
System.out.println("Server:"+line);
//在系統標准輸出上列印讀入的字元串
System.out.println("Client:"+is.readLine());
//從Client讀入一字元串,並列印到標准輸出上
line=sin.readLine();
//從系統標准輸入讀入一字元串
} //繼續循環
os.close(); //關閉Socket輸出流
is.close(); //關閉Socket輸入流
socket.close(); //關閉Socket
server.close(); //關閉ServerSocket
}catch(Exception e){
System.out.println("Error:"+e);
//出錯,列印出錯信息
}
}
}
4. java自定義事件,線程a如何每一秒鍾觸發一個事件,然後另一個線程b監聽之,並作出反應
線程a是作為事件源,那麼線程a這個類就必須提供一個可以增加監聽器的方法,就像GUI編程中的addActionListener這個樣的方法。線程a這個類裡面是有一個專門存放監聽器的一個容器,例如是list。然後你 增加監聽器的方法就是把監聽器放進這個容器裡面。你用一個監聽器去監聽一個事件的發生,就可以在線程a這個類中,寫一個產生事件的一段代碼,然後每當產生一個事件之後,去遍歷list,去調用監聽器的對於這個事件的處理方法,這樣子就可以了。這應該就是java中的事件模式。
5. java 自定義事件的觸發及監聽
JAVA事件響應機制
1,先自定義一個事件
public class MyEvent extends java.util.EventObject{
public MyEvent(Object source)
{
super(source);
}
}
2,再自定義一個監聽器
public class MyListener implements java.util.EventListener{
//這里是當事件發生後的響應過程
public void EventActivated(MyEvent me)
{
System.out.println("事件已經被觸發");
}
}
3,以下這個類為觸發事件的事件源
public class MyObject {
private Vector vectorListeners=new Vector();
public synchronized void addMyListener(MyListener ml)
{
vectorListeners.addElement(ml);
}
public synchronized void removeMyListener(MyListener ml)
{
vectorListeners.removeElement(ml);
}
protected void activateMyEvent()
{
Vector tempVector=null;
MyEvent e=new MyEvent(this);
synchronized(this)
{
tempVector=(Vector)vectorListeners.clone();
for(int i=0;i<tempVector.size();i++)
{
MyListener ml=(MyListener)tempVector.elementAt(i);
ml.EventActivated(e);
}
}
}
//定義一個公用方法用於觸發事件
public void test()
{
activateMyEvent();
}
}
4,測試類
public class Test {
public static void main(String[] args)
{
MyObject mo=new MyObject();
//注冊該事件
mo.addMyListener(new MyListener());
//觸發該事件
mo.test();
}
}