這幾天寫了一個QQ登錄界面,本來想做到高仿的,但是現在得做Kinect項目,無奈這個就得放一放了,但是現在這裏做個記錄
先說一下思想:
由JFrame和多個JPanel組成,
1.界面要重新修整,主要用setUndecorated(true);去除除窗體,然後加上拖動窗體的方法;
用setAlwaysOnTop(true);方法讓界面懸浮
設置背景,通過判斷時間來選擇不同的圖片做背景
2.JPanel上要實現組件上不同圖片改變問題
在這裏用MouseListener實現,主要用到三個事件,mousePressed,mouseEntered,mouseExited,也就是在觸發這三個事件時
組件要通過setIcon方法轉換不同的圖片,所以每個組件都要準備三張(至少兩張)圖片,
下面用圖片對比一下:
這個是添加登錄界面
現在界面上還有沒解決的問題就是那兩個輸入框,也求大神指點
在這裏小說一下拖動窗體的方法 感覺這個比較重要(寫一個類說明):
package QQLoginUI;
import java.awt.Cursor;
import java.awt.Point;
import java.awt.event.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class SetFrame extends JFrame{
private Boolean isMove;
private Point loc,now;
public SetFrame(){
setSetFrame();
}
public void setSetFrame(){
this.setSize(380,290);
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
this.setLayout(null);
this.setUndecorated(true);
this.setAlwaysOnTop(true);
setMoved();
this.setVisible(true);
}
/*
* 拖動窗體方法
*/
private void setMoved(){
SetFrame.this.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
isMove = false;
SetFrame.this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
public void mousePressed(MouseEvent e) {
loc = new Point(e.getX(), e.getY());//獲取窗體位置
isMove = true;
SetFrame.this.setCursor(new Cursor(Cursor.MOVE_CURSOR));
}
});
SetFrame.this.addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
if(isMove){
now = new Point(SetFrame.this.getLocation().x+e.getX()
-loc.x,SetFrame.this.getLocation().y+e.getY()
-loc.y);
SetFrame.this.setLocation(now);
}
}
});
}
public static void main(String[] args) {
new SetFrame();
}
}
這個類只需加上圖片和界面最小化、關閉事件就行了 比swing原來的界面漂亮!
源碼地址:源碼