GUI程式設計基礎學習(一)——框架JFrame、面板JPanel
框架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))方法後,問題解決。