框架是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(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))方法后,问题解决。