﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-闵毓-随笔分类-Swing in action</title><link>http://www.blogjava.net/shmily432685/category/4004.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 04:32:11 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 04:32:11 GMT</pubDate><ttl>60</ttl><item><title>利用Java Swing 实现游戏开发 </title><link>http://www.blogjava.net/shmily432685/archive/2005/10/20/16177.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Thu, 20 Oct 2005 10:05:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2005/10/20/16177.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/16177.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2005/10/20/16177.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/16177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/16177.html</trackback:ping><description><![CDATA[<STRONG>Swing初体验</STRONG> <BR><BR>　　对于想学习Swing编程的朋友，我们特地为大家准备了一些小窍门。首先，下载并阅读代码是极有必要的。由于这是一篇关于Swing的教程，所以，我们只是尽可能讲解一些与Swing有关的内容，与Swing无关的内容一般不会涉及，例如算法部分。其次，受篇幅限制，也不可能在这里将每部分代码都写得完完整整的，所以，大家也需要对照完整代码来看。最后，为了使大家更容易把精力集中在Swing学习上，我们也将游戏开发中所需资源放在下载文件中，大家下载后便能够编译运行，看到执行结果。（下载游戏源文件）<BR><BR>　　1.顶层容器<BR><BR>　　什么是顶层容器？当我们使用Java进行图形编程的时候，图在哪里绘制呢？我们需要一个能够提供图形绘制的容器，这个容器就被称为顶层容器，你也可以把它想象成一个窗口。顶层容器是进行图形编程的基础，一切图形化的东西，都必然包括在顶层容器中。在Swing中，我们有三种可以使用的顶层容器，它们分别是:<BR><BR>　　·JFrame:用来设计类似于Windows系统中的窗口形式的应用程序。 <BR>　　·JDialog:和JFrame类似，只不过JDialog是用来设计对话框。 <BR>　　·JApplet:用来设计可以在嵌入在网页中的Java小程序。 <BR><BR>　　如果需要使用Swing制作一个窗口类程序，我们的代码看起来应该是这样: <BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>import javax.swing.*;<BR><BR>public class KyodaiUI<BR>extends JFrame {<BR>……<BR>}</TD></TR></TBODY></TABLE><BR>　　2.控件<BR><BR>　　控件是构成应用程序界面的基本元素，按钮、文本框、进度条等，这些都是控件。控件(这里我们只讨论可视化控件)又可以分为容器控件和非容器控件。从字面意义上来理解，容器控件就是能包含其他控件的特殊控件，例如，Java中的JPanel控件就属于容器型控件，我们可以在JPanel中放置按钮、文本框等非容器控件，你甚至可以在JPanel中再放置若干个JPanel控件(值得注意的是，顶层容器也是容器型控件，每一个窗口应用程序中有且只能有一个顶层容器控件，换句话说，顶层容器不能包括在其他的控件中)。<BR><BR>　　Java中的容器控件有很多，除刚才提到的JPanel外，还有JTabbedPane、JScrollPane等，非容器控件有JButton、JLabel、JTextField等。如果你需要向某个容器型的控件中添加控件，你可以使用 add(Component comp) 方法来实现，如:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>JPanel panel = new JPanel();<BR>JButton button = new JButton();<BR>panel.add(button);</TD></TR></TBODY></TABLE><BR>　　3.布局<BR><BR>　　什么是布局？布局是Java中用来控制控件排列位置的一种界面管理系统。使用过其他可视化编程开发语言的人在初次接触Java界面设计时，总会感觉到Java界面设计很别扭:居然没有提供所见即所得的设置控件坐标的方法！然而，事实证明，Java本身提供的布局管理系统也一样能够出色地完成我们的需要，而且在跨平台时表现得更有优势。<BR><BR>　　常用的布局有:<BR><BR>　　·BorderLayout:将界面分割为上下左右以及中间一块区域的管理系统，在BorderLayout布局中，最多你只能放5个控件，如果超过5个控件，建议还是选用其他的布局系统吧。 <BR><BR>　　·GridLayout:GridLayout是将用户界面切割为棋盘一样的布局管理系统。如果我们要设计一个类似于Windows中自带的计算器软件，GridLayout无疑是最佳选择。 <BR><BR>　　·FlowLayout:FlowLayout与上述两类布局管理系统不太一样，在FlowLayout中，你不必指定每个控件放在哪，你只需要把控件加入到FlowLayout中，FlowLayout就会根据你添加控件的顺序依次放置控件，如果空间不够，会自动换行。<BR><BR>　　在对这几个布局管理系统有了基本认识后，我们就一起来进入界面设计吧。在仔细观察了QQ游戏中“连连看”的设定后，我们可以发现，整个界面分为三个区，顶部是系统菜单区，占地面积最大的是用户游戏区，另外还有一个用户交互区，每个区域中都由若干控件组成。<BR><BR>　　这么多控件，我们从哪开始入手呢？由于容器控件中可以放置其他控件，因此，我们只需要先确定放置的容器控件就可以了。 既然已经知道需要使用容器控件的个数，接下来让我们就进入布局管理系统的选择。用GridLayout？似乎有点勉强，用FlowLayout？还有更好的选择吗？对了，我想你一定想到了是BorderLayout吧，如下图2所示。<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG src="http://dev.yesky.com/imagelist/05/10/3r9t8st4n609.jpg" border=0></DIV></TD></TR></TBODY></TABLE><BR>　　动手之前，大家一定要注意的是，界面的设计要先考虑好尺寸，不管是主程序界面的大小还是每个区域的大小，如果没有设计好合适的尺寸，将来改动起来会十分痛苦。<BR><BR>　　下面便是相应的源程序:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>import java.awt.*;<BR>import javax.swing.*;<BR><BR>public class KyodaiUI extends JFrame {<BR>public KyodaiUI() {<BR>this.setSize(780， 500); //将窗体的大小设定为780*500<BR>this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<BR>this.setResizable(false); //窗体不能改变大小<BR>this.setTitle("连连看"); //设置标题<BR><BR>JPanel toolBar = new JPanel();<BR>toolBar.setBackground(Color.white);<BR>toolBar.setPreferredSize(new Dimension(780， 48));<BR><BR>　 JPanel actionPanel = new JPanel(); //新建JPanel型的控件<BR>actionPanel.setBackground(Color.yellow); //设置背景色<BR>actionPanel.setPreferredSize(new Dimension(160， 380)); //设置大小<BR><BR>　JPanel contentPanel = new JPanel();<BR>contentPanel.setBackground(Color.blue);<BR>contentPanel.setPreferredSize(new Dimension(620， 380));<BR>this.getContentPane().add(toolBar， BorderLayout.NORTH);<BR>this.getContentPane().add(actionPanel， BorderLayout.EAST);<BR>this.getContentPane().add(contentPanel， BorderLayout.CENTER);<BR>}<BR><BR>　　 public static void main(String[] args) throws HeadlessException {<BR>KyodaiUI kyodaiUI = new KyodaiUI();<BR>kyodaiUI.show();<BR>}<BR>}</TD></TR></TBODY></TABLE><BR>　　让我们来看看上面这段程序是如何运行的。首先，extends JFrame表明了这是从JFrame中继承过来的，JFrame是最基本的顶层容器控件。实际上，在JDK中，以字母J打头的控件都是Swing控件。然后设置了容器的属性，其中，setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)是用来告诉Java虚拟机，当用户点击窗体右上角的“关闭”按钮时，关闭该窗口进程。如果不这么做的话，你会发现虽然你可以点将窗口关闭，然而程序却没有退出。在接下来的代码中，我们为顶层容器添加了三个Panel容器。要注意的是，在AWT中，我们可以直接写为add(toolBar， BorderLayout.NORTH) ，而在 Swing 中却一定要写成getContentPane(). add(toolBar， BorderLayout.NORTH) ，否则程序就会出错。<BR><BR>　　现在大家可以放在编译运行看看，是不是和我的运行结果一样(见图3)？<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG alt="" hspace=0 src="http://images.csdn.net/20051019/v60g3pfwoftu.jpg" width=400 align=baseline border=0></DIV></TD></TR></TBODY></TABLE><BR>　　4.边框<BR><BR>　　虽然我们使用了不同前景色来区别不同的区域，然而却没有层次感，加上边框一定会漂亮许多。<BR><BR>　　在Java中，所有以J打头的Swing控件都可以使用setBorder方法来为自己设置边框。边框有很多种，线型、凸起、凹下、空的，你甚至可以自由组合形成个人风格。所有的Border都必须使用javax.swing.BorderFactory中提供的静态方法来创建，比如: <BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>Border border = BorderFactory.createBevelBorder(BevelBorder.LOWERED，<BR>new Color(45， 92， 162)，<BR>new Color(43， 66， 97)，<BR>new Color(45， 92， 162)，<BR>new Color(84， 123， 200));</TD></TR></TBODY></TABLE>
<P><BR>　　现在，我们将toolBar.setBackground(Color.white)改为toolBar.setBorder(border)，立体效果是不是已经出现了？<BR></P>
<P><SPAN id=LblContent>　　<B>实战——写上自己的大名</B> <BR><BR>　　现在我们已经有了一个能够运行的界面了，虽然它什么也做不了，但是请你别慌，罗马不是一天建成的。<BR><BR>　　现在让我们在菜单区提供一个“关于”菜单，用来显示程序的信息，难道你不想让别人知道你的大名吗？Swing本身就提供了现成的按钮控件JButton，我们只需要创建一个新的按钮:JButton about = new JButton("关于");这个按钮该怎么放到菜单区而不是别的地方呢？我们可以加入下面的代码:toolBar.add(about);咦，怎么点按钮没有反应？这是因为你还没有告诉程序点击按钮时要做什么事情呢。要为按钮添加事件响应，首先需要使用about.addActionListener(this)来告诉程序监听按钮按下时的事件，由于ActionListener是一个程序接口，因此，我们在类的申明的地方也得做一点小小的修改:public class KyodaiUI extends JFrame implements ActionListener {...}实现ActionListener接口是为了告诉程序我要进行事件处理了。当然，最后我们得添加响应事件的代码:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>public void actionPerformed(ActionEvent e) {<BR>if (e.getSource() == about) {<BR>JOptionPane.showMessageDialog(this， "我的大名"， "关于"，<BR>JOptionPane.INFORMATION_MESSAGE);<BR>return ;<BR>}<BR>}</TD></TR></TBODY></TABLE><BR>　　其中，e.getSource() 表示当前触发事件的控件，由于我们的程序中往往会有多个以上的控件，这些控件都有可能产生事件，所以我们必须使用这个方法来找到产生事情的控件。<BR><BR>　　<B>小结</B><BR><BR>　　让我们一起来回顾一下今天所学的内容:首先我们了解了顶层容器，也知道了控件分为容器控件和非容器控件，同时还知道使用边框，最后，我们还小小的处理了一下按钮的事件。<BR><BR>　　学而时习之，不亦说乎，就让我留点小小的作业，帮助大家巩固一下今天所学的内容:上面我们添加的按钮在菜单栏的中间，并不美观，请大家放到左边或右边试试。<BR><BR>　　最后向大家提供一些比较好的参考资料:<BR><BR>　　●Creating a GUI with JFC/Swing<BR>　　http://java.sun.com/docs/books/tutorial/uiswing/index.html <BR>　　●2D Graphics<BR>　　http://java.sun.com/docs/books/tutorial/2d/index.html <BR>　　●JDK API<BR>　　http://java.sun.com/j2se/1.4.2/docs/api/index.html <BR></SPAN></P><img src ="http://www.blogjava.net/shmily432685/aggbug/16177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2005-10-20 18:05 <a href="http://www.blogjava.net/shmily432685/archive/2005/10/20/16177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>