框架JFrame

框架是Swing GUI應用程式的主視窗,視窗有邊界、標題、關閉按鈕等。

JFrame類是java.awt包中Frame類的子類,它建立的物件時窗體,窗體是重量級容器;

補充:javax.swing包下的大部分元件是由Java程式碼實現的輕量級元件,因此它具備平臺移植性,而java.awt包下的大部分元件則是呼叫了作業系統的函式畫出來的元件;輕量級元件必須佈局在重量級元件之上。

因此不能直接把元件直接新增到Swing窗體中,窗體自帶一個內建面板容器,應該把元件新增到其內建面板中;

JFrame frame = new JFrame();//例項化一個窗體物件
Container container = frame.getContentPane();//獲取窗體物件內建面板容器
container.add(component);//將元件放置到面板容器中

框架(JFrame)常用的方法和事件如下:

①frame.setVisible(true):顯示框架物件代表的框架視窗

②frame.setSize(400,400):設定視窗的初始大小

③frame.pack():調整視窗大小為適合其子元件的首選大小和佈局

④frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE):當用戶點選視窗右上角的x時,自動退出程式;

⑤frame.setLocationRelativeTo(null):讓視窗顯示在螢幕正中間

案例:基於JFrame實現的視窗示例,其中含有一個“Hello World”的標籤,當用戶點選視窗右上角的x時,退出程式:

import java.awt.*;
import javax.swing.*;


public class Main {

	public static void main(String[] args) {
		JLabel label = new JLabel("Hello World");//例項化一個標籤物件
		JFrame frame = new JFrame();//例項化一個窗體物件
		Container container = frame.getContentPane();//獲取窗體物件內建面板容器
		container.add(label);//向內建面板新增標籤元件
		frame.pack();//自適應
//		frame.setSize(200,200);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//當用戶點選窗體右上角x時自動推出程式
		frame.setLocationRelativeTo(null);//讓窗體顯示在螢幕正中間
		frame.setVisible(true);//展示窗體
	}

}

面板JPanel

JPanel元件定義的面板實際上是一種容器元件,用來容納各種其他輕量級元件,此外,使用者還可以用這種面板容器繪製圖形。

JPanel的構造方法如下:

①JPanel():建立具有雙緩衝和流佈局的面板

②JPanel(LayoutManager layout):建立具有指定佈局管理器的面板

JPanel的常用方法如下:

①void add(Component c):向JPanel中新增元件

②void add(Component c,int index):新增元件至索引指定位置

③void add(Component c,Object o):按照指定佈局管理器限制新增元件

④void add(Component c,Object o,int index):按照指定佈局管理器限制新增元件至索引指定位置

⑤void remove(Component c):移除JPanel中的指定元件

⑥void removeAll():移除JPanel中的所有元件

⑦void paintComponent(Graphics g):繪製元件

⑧void repaint():重新繪製

⑨void setPreferredSize(Dimension d):設定JPanel大小

⑩Dimension getPreferredSize():獲取JPanel最佳大小 

案例:使用JPanel對遊戲介面進行模組化,將介面劃分成遊戲主面板、輔助面板,從而提升使用者體驗

在這裡,GamePanel類是主遊戲面板類,負責主要的遊戲介面,而HelpPanel類是輔助面板類,負責記錄一些遊戲相關的遊戲資料;兩者均是JPanel物件,這裡顯示的東西比較簡單,主面板設定為藍色,輔助面板設定為黃色,用做模板示例

GamePanel類:

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.*;

//主要面板
public class GamePanel extends JPanel{
	
	public GamePanel(){
		this.setPreferredSize(new Dimension(650,750));
		this.setVisible(true); 
		this.add(new JLabel("這裡是遊戲主面板"));
		this.setBackground(Color.blue);
	}
	
}

HelpPanel類:

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.*;

//輔助面板
public class HelpPanel extends JPanel{

	public HelpPanel(){
		this.setPreferredSize(new Dimension(200,750));
		this.setVisible(true); 
		this.add(new JLabel("這裡是輔助面板"));
		this.setBackground(Color.yellow);
	}
	
}

GameClient類:

import java.awt.*;

import javax.swing.*;

//遊戲窗體類
public class GameClient extends JFrame{

	public GameClient(){
		GamePanel gamePanel = new GamePanel();//例項化主面板物件
		HelpPanel helpPanel = new HelpPanel();//例項化輔助面板物件
		Container container = this.getContentPane();//獲取窗體內建容器
		container.setLayout(new BorderLayout());//設定佈局
		container.add(gamePanel,BorderLayout.CENTER);//新增遊戲主面板到內建容器
		container.add(helpPanel,BorderLayout.EAST);//新增遊戲輔助面板到內建容器
		this.setSize(850,750);//設定窗體大小
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//當用戶點選窗體右上角的x時,自動退出程式
		this.setTitle("遊戲面板");//設定窗體標題
		this.setVisible(true);//展示窗體
	}
	
	public static void main(String[] args) {
		new GameClient();
	}

}

兩個案例的執行效果如下:

再補充下自己在開發中曾經遇到的問題:

①點選右上角的x時,程式沒有退出

忘記對窗體進行設定了,使用frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)程式碼進行設定解決。

②在部分遊戲開發裡,JPanel的大小總是不能按照預期的大小進行調整

自己原本想使用panel.setSize(int width,int height)方法調整JPanel大小,該方法實際上並不能對JPanel進行大小上的調整;改回panel.setPreferredSize(new Dimension(int width,int height))方法後,問題解決。