项目代码架构:
GameFrame是对游戏主体的设置
LoginFrame是对登录的设置
GameRun是游戏启动设置
Tool是工具类
先设计游戏主窗体:
GameRun类的代码:
import ayue.ui.GameFrameTest;
public class GameRun {
public static void main(String[] args) {
new GameFrame(580, 608, "拼图单机版 v1.0");
}
}
import javax.swing.*;
import java.awt.*;
public class GameFrame extends JFrame {
/**
* 游戏主窗体构造器
* width: 窗体宽 单位px
* height:窗体高
* title:标题
*/
public GameFrame(int width, int height, String title){
// 设置窗体样式
this.initFrame(width, height, title);
// 让页面显示
this.setVisible(true);
}
// 窗体显示设置
private void initFrame(int width, int height, String title){
// 设置尺寸
this.setSize(width, height);
// 设置窗体的标题
this.setTitle(title);
// 设置屏幕在正中心
this.setLocationRelativeTo(null);
// 设置页面关闭模式
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
结果:
添加菜单栏:使用JFrame中的setJMenuBar
源码:
有关菜单的组件大概是:菜单栏 menu bar、菜单 menu、菜单项 menu item、单选按钮菜单项 radio button menu item、复选框菜单项 check box menu items 和分隔符 separators
本游戏中用到的是:菜单栏 menu bar、菜单 menu、菜单项 menu item
三者的关系是:菜单项加载在菜单里,菜单加载在菜单栏里
对应的三个类是:JMenuBar、JMenu、JMenuItem
JMenuBar的描述:An implementation of a menu bar. You add JMenu objects to the menu bar to construct a menu. When the user selects a JMenu object, its associated JPopupMenu is displayed, allowing the user to select one of the JMenuItems on it.
JMenuBar添加菜单的源码
JMenu中添加JMenuItem
菜单相关类的继承层次结构图:
GameFrame
import javax.swing.*;
import java.awt.*;
public class GameFrame extends JFrame {
/**
* 游戏主窗体构造器
* width: 窗体宽 单位px
* height:窗体高
* title:标题
*/
public GameFrame(int width, int height, String title){
// 设置窗体样式
this.initFrame(width, height, title);
// 添加菜单栏
this.setJMenuBar(getJMenuBars());
// 让页面显示
this.setVisible(true);
}
// 窗体显示设置
private void initFrame(int width, int height, String title){
// 设置尺寸
this.setSize(width, height);
// 设置窗体的标题
this.setTitle(title);
// 设置屏幕在正中心
this.setLocationRelativeTo(null);
// 设置页面关闭模式
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
// 设置菜单
private JMenuBar getJMenuBars(){
// 创建JMenuBar对象
JMenuBar jMenuBar = new JMenuBar();
// 创建菜单
JMenu functionMenu = new JMenu("功能");
// 创建选项中的三个小的条目
JMenuItem replayItem = new JMenuItem("重新游戏");
JMenuItem reLoginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
// 将条目添加到选项里
functionMenu.add(replayItem);
functionMenu.add(reLoginItem);
functionMenu.add(closeItem);
JMenu aboutMenu = new JMenu("关于我们");
JMenuItem accountItem = new JMenuItem("公众号");
aboutMenu.add(accountItem);
// 把菜单添加到菜单栏
jMenuBar.add(functionMenu);
jMenuBar.add(aboutMenu);
return jMenuBar;
}
}
效果图:
添加图片
添加图片需要用到对象:ImageIcon
ImageIcon其中两个构造器:
因为ImageIcon不是一个组件,所以它要先加载到JLabel中
JLable是一个管理文字和图片的组件:
A display area for a short text string or an image, or both.
JLabel其中一个构造器:
或者:
也可以使用setIcon方法:
JFrame、RootPane、ContentPane
在把JLabel加载到窗体中时需要使用getContentPane方法:
JFrame中的getContentPane方法
JFrame中的getRootPane
从上面的截图中可以看出RootPane是JFrame的属性
RootPane是根窗格、ContentPane是内容窗格
在官方文档中这样描述:
Each top-level container relies on a reclusive intermediate container called the root pane. The root pane manages the content pane and the menu bar, along with a couple of other containers. You generally don't need to know about root panes to use Swing components. However, if you ever need to intercept mouse clicks or paint over multiple components, you should get acquainted with root panes.
每个顶层的容器都依赖于一个被称为根窗格的隐蔽的中间容器。根窗格管理着内容窗格和菜单栏,以及其他几个容器。你一般不需要了解根窗格来使用Swing组件。然而,如果你需要拦截鼠标点击或在多个组件上作画,你应该熟悉根窗格
以下是根窗格提供给框架(以及所有其他顶级容器)的组件列表:
We've already told you about the content pane and the optional menu bar. The two other components that a root pane adds are a layered pane and a glass pane. The layered pane contains the menu bar and content pane, and enables Z-ordering of other components. The glass pane is often used to intercept input events occuring over the top-level container, and can also be used to paint over multiple components.
我们已经向您介绍了内容窗格和可选菜单栏。根窗格添加的另外两个组件是分层窗格和玻璃窗格。分层窗格包含菜单栏和内容窗格,并启用其他组件的 Z 排序。玻璃窗格通常用于拦截发生在顶级容器上的输入事件,也可用于绘制多个组件。
JRootPane的组件属性:
添加背景图片
import javax.swing.*;
import java.awt.*;
public class GameFrame extends JFrame {
/**
* 游戏主窗体构造器
* width: 窗体宽 单位px
* height:窗体高
* title:标题
*/
public GameFrame(int width, int height, String title){
// 设置窗体样式
this.initFrame(width, height, title);
// 添加菜单栏
this.setJMenuBar(getJMenuBars());
// 添加背景图片
this.addBackgroundImage();
// 让页面显示
this.setVisible(true);
}
// 窗体显示设置
private void initFrame(int width, int height, String title){
// 设置尺寸
this.setSize(width, height);
// 设置窗体的标题
this.setTitle(title);
// 设置屏幕在正中心
this.setLocationRelativeTo(null);
// 设置页面关闭模式
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
// 设置菜单
private JMenuBar getJMenuBars(){
// 创建JMenuBar对象
JMenuBar jMenuBar = new JMenuBar();
// 创建菜单
JMenu functionMenu = new JMenu("功能");
// 创建选项中的三个小的条目
JMenuItem replayItem = new JMenuItem("重新游戏");
JMenuItem reLoginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
// 将条目添加到选项里
functionMenu.add(replayItem);
functionMenu.add(reLoginItem);
functionMenu.add(closeItem);
JMenu aboutMenu = new JMenu("关于我们");
JMenuItem accountItem = new JMenuItem("公众号");
aboutMenu.add(accountItem);
// 把菜单添加到菜单栏
jMenuBar.add(functionMenu);
jMenuBar.add(aboutMenu);
return jMenuBar;
}
// 添加背景图片
private void addBackgroundImage(){
ImageIcon imageIcon = new ImageIcon("puzzlegame/image/background.png");
JLabel jLabel = new JLabel(imageIcon);
this.getContentPane().add(jLabel);
}
}
运行效果:
因为在加载JLabel时先添加的会处于上层,因此需要先添加游戏的拼图图片:
试着添加一张:
// 添加拼图图片
private void addPuzzleImage(){
JLabel jLabel = new JLabel(new ImageIcon("puzzlegame/image/animal/animal1/1.jpg"));
this.getContentPane().add(jLabel);
}
效果:
在添加图片时图片会默认居中,如果要使图片在你设置的位置出现就需要取消默认的居中放置,并指定位置
使用setLayout方法设置LayoutManager为null取消居中
默认居中由来:
JFrame
JRootPane
JFrame中的setLayout
未使用setLayout(null)时设置图片位置