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

猜你喜欢

转载自blog.csdn.net/A1344714150/article/details/85868293