基於Java Swing的GUI設計
團隊博客
界面切換
利用CardLayout卡片布局,將多張“卡片”命名,需要調用時再通過名字切換至相應的“卡片”
while(true) {
switch(nextView) {
case "startView":
cardlayout.show(views, "startView");
startView.setRunning(true);
nextView = startView.action();
break;
case "modelMenuView":
cardlayout.show(views, "modelMenuView");
modelMenuView.setRunning(true);
nextView = modelMenuView.action();
break;
case "chapterMenuView":
cardlayout.show(views, "chapterMenuView");
chapterMenuView.setRunning(true);
nextView = chapterMenuView.action();
break;
case "userLoadinView":
cardlayout.show(views, "userLoadinView");
userLoadinView.setRunning(true);
nextView = userLoadinView.action();
break;
}
}
自定義action方法的作用與isRunning
action方法中有while,當isRunning就會一直停止在當前界面,結合鼠標監聽器更改isRunning的值來控制界面變化
/*StartView例*/
public String action() {
MouseListener ma = new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
if(e.getX() > 670 && e.getX() < 850 && e.getY() > 660 && e.getY() < 740) //按下開始游戲按鈕進入下一個頁面
{
gameStartButton.mouseClick();
nextView = "userLoadinView";
isRunning = false;
}
if(e.getX() > 60 && e.getX() < 120 && e.getY() > 690 && e.getY() < 770) { //按下退出按鈕程序結束
System.exit(0);
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
mouse.mousePress();
}
@Override
public void mouseReleased(MouseEvent e) {
mouse.mouseLoose();
}
};
MouseMotionListener mb = new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
mouse.moveTo(e.getX(),e.getY());
}
@Override
public void mouseMoved(MouseEvent e) {
mouse.moveTo(e.getX(),e.getY());
if(e.getX() > 670 && e.getX() < 850 && e.getY() > 660 && e.getY() < 740 ) {
gameStartButton.mouseMoveIn();
}
else {
gameStartButton.mouseMoveOut();
}
if(e.getX() > 60 && e.getX() < 120 && e.getY() > 690 && e.getY() < 770) {
quitButton.mouseMoveIn();
}
else {
quitButton.mouseMoveOut();
}
}
};
addMouseListener(ma);
addMouseMotionListener(mb);
while(isRunning) {
repaint(); //重繪JPanel界面
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
return nextView;
}
動態按鈕效果
實際上只是當鼠標監聽器監聽到鼠標位於按鈕上時,使用較大的圖片替換掉較小的圖片
美觀的輸入文本框
實際上是PS出來的的素材結合JTextField和JPasswordField做出來的。JTextField和JPasswordField的背景色與素材背景色一致並取消邊框。
this.userNameField = new JTextField(); //用戶名輸入框
this.userNameField.setBounds(820, 450, 300, 50); //設置位置大小
this.userNameField.setBackground(new Color(255,229,164)); //設置背景顏色
this.userNameField.setFont(new Font("Serif", Font.PLAIN, 24)); //設置字體大小
this.userNameField.setBorder(null); //設置沒有邊框
this.add(userNameField); //添加至當前視圖
this.passwordField = new JPasswordField(); //密碼輸入框
this.passwordField.setBounds(820, 570, 300, 80); //設置位置大小
this.passwordField.setBackground(new Color(255,229,164)); //設置背景顏色
this.passwordField.setFont(new Font("Serif", Font.PLAIN, 24)); //設置字體大小
this.passwordField.setBorder(null); //設置沒有邊框
this.add(passwordField); //添加至當前視圖