服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

跟我学java swing之游戏设计(4)

  上一节:跟我学java swing之游戏设计(3)

  你有没有经历过装修?尽管它是件劳神费力的事,可现代人还是不遗余力地在装修上花尽心思。毕竟,在这个视觉支配感观的时代里,谁会嫌自己家太漂亮呢?今天,就让我们秉着精益求精的完美主义精神,在上次已经完成的游戏界面里再做一番细致的装饰,将装修进行到底!

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)?

跟我学java swing之游戏设计(4)

图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格式确实是一件令人兴奋的事情,我们只需要简单的将<html>标记写在控件中就行了,比如可以这样创建一个jlabel:

jlabel label = new jlabel("<html><font color=red>red</font></html>");

  然而,直到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)。

跟我学java swing之游戏设计(4)

图2:漂亮的帮助文档

  改变鼠标光标的样式

  目前为止,我们在程序界面上已经花了很多功夫,界面也慢慢变得漂亮起来。不过,装饰永无止境,下面就来谈谈如何改变鼠标光标的样式吧。实际上,createcustomcursor(image cursor, point hotspot, string name)就能满足要求。其中,cursor是要设置为光标的图片,hotspot是图片显示在实际光标位置的位移,name是给光标起的名字。现在挑选一张自己喜欢的图片来作为程序的光标吧(见图3)。

跟我学java swing之游戏设计(4)

图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这杯咖啡品完,谢谢大家的支持,欢迎大家随时光临我们的咖啡馆哦!

扫描关注微信公众号