java swing实现图文混排_跟我学Java Swing之游戏设计(4)
你有没有经历过装修?尽管它是件劳神费力的事,可现代人还是不遗余力地在装修上花尽心思。毕竟,在这个视觉支配感观的时代里,谁会嫌自己家太漂亮呢?今天,就让我们秉着精益求精的完美主义精神,在上次已经完成的游戏界面里再做一番细致的装饰,将装修进行到底!
JDialog增强型对话框窗口
还记得我们最初做的“关于”功能吗?虽然“关于”对话框能很好工作,但当你要写比较长或者是比较复杂的内容时,就会感觉到JOptionPane有些捉襟见肘.
让我们用JDialog来制作漂亮的对话框吧!JDialog和JFrame一样同属顶层容器控件,使用方法JPanel几乎一样。下面先来看看我们的第一个JDialog小程序吧:
public class AboutDialog extends JDialog {
JLabel about = new JLabel("关于:这可是JAVA写的连连看哦!");
public AboutDialog(JFrame frame) {
this.setTitle("About");
this.setSize(320, 200);
about.setHorizontalAlignment(SwingConstants.CENTER);
this.getContentPane().add(about, BorderLayout.CENTER);
this.show();
}
}
然后将主程序中的“关于”部分的代码修改如下:
if (e.getSource() == about) {
new AboutDialog();
return ;
}
现在运行看看,是不是大气多了?当然,现在的样子仍稍嫌简陋了一点,所以还得再接再励。这里告诉大家一点小技巧:如果在程序中加入了
JDialog.setDefaultLookAndFeelDecorated(true),对话框窗口的显示就会使用Java的外观风格,会比原来的
对话窗口漂亮得多!需要注意的是,当使用了Java观感后,对话框右上角的关闭按钮就不会显示出来,因此得自己加上“关闭”按钮及关闭窗口的事件处理。
自己动手试试,你能做出和我一样漂亮的对话框吗(见图1)?
图1:漂亮的对话框
黄糖故事
模态窗口和非模态窗口
在
Windows中,我们常常会接触到模态窗口和非模态窗口。所谓模态窗口,就是指当前窗口弹出时,只有关闭此窗口才能继续进行其它窗口的操作。非模态窗口
则是即使不关闭当前的窗口,也可以对后面的的窗口进行操作。最典型的例子就是Windows
中自带的“记事本”软件,“字体”功能就是模态窗口,而“查找”功能就是非模态窗口了。
在JDialog中,我们可以用JDialog(Frame owner, boolean modal)来指定对话框的模态或非模态状态。
在控件上使用HTML标签
大多数的Swing控件可以显示文字,对于这些控件,在一般情况下,只能使用单一字体、单一样式、单一颜色来显示。比如说,当要在标签JLabel控件
上显示文件时,我们会用到JLabel的setFont()、setForeground()等方法,并且代码看起来会是这样:
label = new JLabel("A label");
label.setFont(new Font("Serif", Font.PLAIN, 14));
label.setForeground(new Color(0xffffdd));
如果想在某段文字中使用不同的字体或颜色,其实可以使用HTML格式。在控件上使用HTML格式确实是一件令人兴奋的事情,我们只需要简单的将标记写在控件中就行了,比如可以这样创建一个JLabel:
JLabel label = new JLabel("RED");
然而,直到JDK 1.4.2,并非所有的控件都可以使用HTML格式,在SUN的官方文档中提到:支持HTML格式的控件只有按钮、菜单、标签、提示、标签面板、树和表格。无论如何,这都是一个非常好用的特性!
强劲的编辑器控件JEditorPane
上面说到了HTML格式,HTML格式使得Swing控件显示文字的能力增加了不少,然而,如果要进行图文混排的显示,HTML格式也无能为力了。
网络让世界变得精彩,互联网中各式各样的网站都与HTML分不开,就算不懂HTML,也可以使用Word、FrongPage等工具制作出漂亮的网页来。因此,如果能够将网页在控件中显示出来,那就解决了不少问题。
JEditorPane是Swing中一款非常强大的文本编辑控件,如果想完全了解JEditorPane的用法,绝不是简简单单的一两篇教程能说讲完
的,大家如果有兴趣,可以看看Java安装目录下demo\jfc\Stylepad下的演示程序,它可以告诉你JEditorPane有多么强大。
在
JEditorPane中,我们完全可以将HTML文件(或写字板等文字处理软件生成的RTF格式的文件)直接显示出来,虽然它还不能完整地支持HTML
的所有标准。因此,大家在制作页面的时候,尽可能的只使用HTML3.2标准的语法而不要使用CSS、JavaScript等特性。
如何让JEditorPane显示HTML文件呢?最简单的做法就是:
JEditorPane EditorPane= new JEditorPane();
URLClassLoader urlLoader = (URLClassLoader)this.getClass().getClassLoader();
URL url = urlLoader.findResource("doc/help.htm");
EditorPane.setEditable(false);
EditorPane.setPage(url);
我们首先使用setEditable(false)语句使JEditorPane中的内容不可编辑,然后再使用setPage(url)方法载入需要显示的HTML文件。
不仅如此,JEditorPane还可以处理HTML中的链接,做法也非常简单。首先,要使JEditorPane能够响应点击链接的事件,我们需实现HyperlinkListener接口。然后,我们为JEditorPane添加超链接的监听:
HelpPane.addHyperlinkListener(this);
最后,我们再实现监听链接事件的处理:
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
JEditorPane pane = (JEditorPane) e.getSource();
if (e instanceof HTMLFrameHyperlinkEvent) {
HTMLFrameHyperlinkEvent evt = (HTMLFrameHyperlinkEvent) e;
HTMLDocument doc = (HTMLDocument) pane.getDocument();
doc.processHTMLFrameHyperlinkEvent(evt);
} else {
try {
pane.setPage(e.getURL());
}
catch (Throwable t) {
t.printStackTrace();
}
}
}
}
只需要简单的三个步骤,我们就可以享受JEditorPane带来的处理HTML页面的好处,做出漂亮的帮助文档了(见图2)。
图2:漂亮的帮助文档
改变鼠标光标的样式
目前为止,我们在程序界面上已经花了很多功夫,界面也慢慢变得漂亮起
来。不过,装饰永无止境,下面就来谈谈如何改变鼠标光标的样式吧。实际上,createCustomCursor(Image cursor,
Point hotSpot, String
name)就能满足要求。其中,cursor是要设置为光标的图片,hotSpot是图片显示在实际光标位置的位移,name是给光标起的名字。现在挑选
一张自己喜欢的图片来作为程序的光标吧(见图3)。
图3:自定义光标
如果仍然觉得意犹未尽,那么还可以制作动画光标。首先准备好一系列图片,然后使用Timer()方法来设置一个定时器,每隔一段时间就变换光标的图片,这样,光标不就动起来了?
声音
声音是Swing的一部分吗?回答是否定的。虽然声音不属于Swing,但为了让我们的游戏更加完美,还是一起来看看怎样处理声音吧。
Java自出道之日就能处理声音,但那时只能在Applet中进行处理,即便如此,声音的格式也只能是少见的AU格式。幸好,SUN意识到了这个问题,在JDK1.3之后,Java就提供了专门的声音处理包来满足声音处理的需求。
Java支持MIDI和WAV格式的声音文件,javax.sound.midi和javax.sound.sampled这两个包就是用来处理
MIDI和WAV文件的。MIDI格式优点在于文件小,缺点是只能保存乐曲而无法包含波形声音信息,WAV格式虽然能包含波形声音信息,可惜文件太大。因
此,我们可以将MIDI作为游戏背景音乐,WAV作为音效。
由于对WAV格式文件的操作和MIDI格式文件的操作十分相似,他们的区别仅在于使用的包不同,因此,我们就以处理MIDI格式的文件为例子吧:
// 读取midi文件
public void loadMidi(String filename) throws IOException, InvalidMidiDataException {
URLClassLoader urlLoader = (URLClassLoader)this.getClass().getClassLoader();
URL url = urlLoader.findResource(filename);
sequence = MidiSystem.getSequence(url);
//sequence保存着MIDI的音序结构
}
// 播放sequence
public void play() {
if (isPlaying) { // 如果已经在播放,返回
return;
}
try {
sequencer = MidiSystem.getSequencer();
sequencer.open();
sequencer.setSequence(sequence); // 加载sequence
sequencer.addMetaEventListener(this); // 添加事件处理
} catch (InvalidMidiDataException ex) {
} catch (MidiUnavailableException e) {
}
// Start playing
thread = new Thread(this);
thread.start();
}
public void run() {
Thread currentThread = Thread.currentThread();
while (currentThread == thread && !isPlaying) {
// 当MIDI没有播放的时候,播放MIDI音乐
sequencer.start();
isPlaying = true;
try {
thread.sleep( 1000l );
}
catch (InterruptedException ex) {
}
}
}
以上是处理MIDI文件的主要代码,代码并不是很长,却已经能很好地完成我们需要的功能了。当然,如果你还不满意,Java也提供了多种方法让你对
MIDI格式的文件进行音调、频率的改变。需要提醒的是,声音处理一定要做为一个单独的线程来进行,究其原因嘛,还是大家自己思考一下了。
结束语
至此,我们的连连看已经成为一道色香俱全的美味佳肴了,虽然游戏中还有很多的技术没有讲解到,然而,作为一个Swing教程,相信对大家也会有所帮助的。
不知道这样的教程是否能够让大家完成连连看这个游戏,如果你有困难或者疑问的话,可以通过leftmoon@163.com与我联系,或者将你感兴趣的
部分告诉编辑吧,我会将自己所知道部分的拿出来与大家共同探讨。在此我衷心感谢大家能够耐心将Swing这杯咖啡品完,谢谢大家的支持,欢迎大家随时光临
我们的咖啡馆哦!
java swing实现图文混排_跟我学Java Swing之游戏设计(4)相关推荐
- mysql图文混排设计方案_《图文混排》教学设计方案
一.学科:信息技术 二.课程背景 课程取自于高等教育出版社<计算机应用基础>(windows xp + office2003)第4章<文字处理软件应用>第5节<图文表混和 ...
- TextView图文混排,显示添加的图片,三种常用方法,亲测
图文混排,文字就不说了,主要是显示图片的方法 1.TextView使用ImageSpan显示图片 [java] view plaincopy <span style="font-siz ...
- Android中实现不同文字颜色和图文混排的Span总结
一.怎么在TextView中设置首行缩进两个字符 在string资源文件中,在文字的前面加入"\u3000\u3000"即可实现首行缩进 在Java代码中,使用setText(&q ...
- python 输出结果图文混排_div css图文混排列表设计中的基础问题总结
最近业务需要,想设计一个比较通用的图文混排的列表.结果设计的过程中遇到了不少问题,虽然都是一些css设计中比较基础的问题,但是自己认为有必要总结下,希望可以帮到一些css设计的初学者,同时也想扩大下自 ...
- Android 图文混排 通过webview实现并实现点击图片
在一个开源项目看到是用的webview 实现的 1. 这是在asset中的一个模板html <html> <head> <title>News Detail< ...
- android论文引用图片,Android自动解析html带图片,实现图文混排
在android中,如何将html代码转换为text,然后显示在textview中呢,有一个简单直接的方法: Java textView.setText(Html.fromHtml(content)) ...
- 仿微信表情输入键盘(支持 Gif 表情图文混排 )
作者 | PandaQ404 地址 | http://www.jianshu.com/p/fddca2b0a26b 声明 | 本文是 PandaQ404 原创,已获授权发布,未经原作者允许请勿转载 简 ...
- mysql emoy表情_GitHub - PandaQAQ/PandaEmoView: emoji gif 表情图文混排,仿微信表情输入...
该库具有以下特点: 支持 emoji 表情图片 支持 gif 动态表情输入显示 支持单张贴图表情(与微信收藏表情一致) 支持题图表情库的添加删除 效果图: 快速使用 引入库 compile 'com. ...
- 自定义UI 简易图文混排
系列文章目录 自定义UI 基础知识 自定义UI 绘制饼图 自定义UI 圆形头像 自定义UI 自制表盘 自定义UI 简易图文混排 自定义UI 使用Camera做三维变换 自定义UI 属性动画 自定义UI ...
最新文章
- OpenCV支持中文字符输出实现
- JS nodeType返回类型
- Tomcat配置server.xml
- 【转】数据结构与算法(上)
- 自己也遇到了-db_recovery_file_dest_size 修改大一点
- value toDF is not a member of org.apache.spark.rdd.RDD[People]
- 存根类 测试代码 java_嘲弄和存根–了解Mockito的测试双打
- 基于(7, 5)归零非删余Turbo码的参数识别与分析
- Go语言init函数你必须记住的六个特征
- 技术实践丨GaussDB(DWS)运维管理功能“升级”的原理和使用
- 对比鸿蒙,Google 的 Fuchsia 当前进度如何?
- 基于XML的ASP留言板
- 电子游戏销售数据分析
- java编译网络爬虫_自己动手做网络爬虫系列——1 | 学步园
- CRM-数据权限设计
- 想要Linux上云?如何实现Linux工作流上云部署
- 10.8.8.8柠檬wifi网页登录_20.5.24—0元Kindle补货了!速度上车!
- 数字图像处理01:imadjust函数的Pyhton实现
- 压缩文件zip怎么查看注释呢,市场上一些破软件不好用啊,我有秘诀
- 三、队列:优先队列+循环队列(击鼓传花算法)
热门文章
- shiro的基本认识
- SpringSecurity原理:探究SpringSecurity运作流程
- python伪随机数模块random详解
- 如何运行linux中的vi,如何在linux中vi使用方法
- python中的platform模块获取平台信息
- 学习TypeScrip1(基础类型)
- android访问win10共享文件夹,手机怎么用ES浏览器访问Win10共享文件教程
- Nginx控制IP(段)的访问策略配置
- CC00307.CloudKubernetes——|KuberNetes运维.V27|——|监控.v04|PromQL查询_运算符|
- web自动化测试之Selenium基础 — XPath定位大全