Java学习笔记之SWING -- 基本SWING程序(添油加醋)

前言:哎,我真是成了夜猫子了,现在每天都凌晨5点左右睡觉,疯了快都。最近发现自己做东西都是碰到了不会的时候才去看,呃,比较托慢速度,而且刚领悟的东西也不一定是对的,消化了还要看吸收啊!而好像关于SWING的东西最近几乎没讲到了,都在讲类似算法的东西了,原谅偶吧,偶也是变学边做的,最多比人家多了点点的想法而已。昨天白天一个人上网的时候感觉自己好空虚,即使在做这个地图编辑器也一样,人是怕寂寞的动物啊,所以也没怎么大弄,今天又添油加醋得弄了点新的想法,并实现了一下,虽然做法很愚钝,不过不失为一个能用的实现,就是不是很实用啊,还是把地图的编写放到人身上,不聪明。不过也有另外的好消息!嘿嘿,偶弄到了新的地图显示,先给大家看看显示效果吧,啊哈哈。  

这个可是16X16大小的基本图元哦~不知道放到手机上会不会太大!我的是128×128的屏幕……        嘿嘿,这个就是我新引进的,比起上次的那个是有过之而不不及吧,就不知道放到我的手机上会不会太大,是在不行就改成8×8大小的,16的估计会太大,谁让偶穷,手机是128×128的呢。(哎,也真是的,都快大学毕业了,还这里玩这些东东,应该想一想以后的工作才是啊,说到底,这个还不是自己在玩!)

        新的图元比较详细,一个地形起码有9个好像,因为有考虑到边缘的显示效果,比我画的强多了,呵呵。

 

 

 

        我有了新的想法,就是本来是把地图全都添加在源文件内的,如果要添加新的地图那么就一定要改源文件并且重新编译,这样就是说没有源文件就不能添加新的元素进去,这就不好玩了,而且重新编译也好浪费时间,还不如做了灵活点,直接把控制信息写到文件中去,然后让程序读入控制文件来决定载入的信息,这样多方便啊,于是很自然就让这个小项目又多了个读取地图资源文件的类:MapResourceFileReader。其实和以前的那个读取地图内容文件的类有点大同小异,不过区别还是有的,由于内部成员变量不同,也没办法做成继承之类的东西,也怪我做这个之前没有系统地考虑这些,本来按照软件工程的要求来做是蛮不错的,但是只有我一个人,寂寞啊,做那个又很枯燥,我又不能一下子想周全,所以就做到哪里想到哪里咯~幸亏是小程序。下面给出代码吧:

import  java.io. * ;
import  javax.swing.ImageIcon;
import  java.util. * ;

/**
 * 
@author SosoAyaen
 *
 * 地图资源文件读入类
 *
*/

public   class  MapResourceFileReader  {

    
private BufferedReader buffReader;
    
private ImageIcon[] imageIconArray;
    
/**
     * Method MapResourceFileReader
     *
     *
     
*/

    
public MapResourceFileReader(String resourseFileName) throws FileNotFoundException, IOException {
        
// TODO: 在这添加你的代码
        buffReader = new BufferedReader( new FileReader(resourseFileName) );
        String picName;
        ArrayList alist 
= new ArrayList();
        
while ((picName = buffReader.readLine()) != null{
            System.out.println (picName);
            alist.add(
new ImageIcon(picName));
        }

        imageIconArray 
= new ImageIcon[alist.size()];
        
for (int i = 0; i<alist.size(); i++{
            imageIconArray[i] 
= (ImageIcon)alist.get(i);
        }

        
    }

    
    
/**
     * Method getImageIconArray
     *
     *
     * 
@return
     *
     
*/

    
public ImageIcon[] getImageIconArray() {
        
// TODO: 在这添加你的代码
        return imageIconArray;
    }


    
/**
     * Method main
     *
     *
     * 
@param args
     *
     
*/

    
public static void main(String[] args) {
        
// TODO: 在这添加你的代码
        try {
            
new MapResourceFileReader("../mapResource/mapR.txt");
        }

        
catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        
catch (IOException e) {
            e.printStackTrace();
        }

    }
    
}

哎,这里对ArrayList不是很熟悉,本来是有个toArray的方法的,可是我把它转换成ImageIcon[]后再给imageIconArray后还是报错,无语,只能下面循环了放进去,如果有好的方法不妨告诉我一下,谢谢了。下面是mapR.txt文件的内容:

..//mapResource//water//water_left.PNG
..//mapResource//water//water_middle.PNG
..//mapResource//water//water_right.PNG
..//mapResource//water//water_blue.PNG
..//mapResource//water//water_deep_normal.png
..//mapResource//mountain//oneHill.PNG
..//mapResource//grass//center.PNG
..//mapResource//grass//left_up.png
..//mapResource//grass//up.png
..//mapResource//grass//right_up.png
..//mapResource//grass//right.png
..//mapResource//grass//right_down.png
..//mapResource//grass//down.png
..//mapResource//grass//left_down.png
..//mapResource//grass//left.png

        其实这里的内容是按实际情况写的,放哪里就怎么写,当然这个不是最终方案,β测试那,要写这么多还不烦死,我很懒惰的,呵呵。有好的想法也可以和我交流哟。

        LandStylePic类也要修改,因为这个是会抛出异常的,所以不能再这个类里面定义final数据了,只能static的了,然后在构造函数中通过MapResourceFileReader中定义的getImageIconArray方法来获得图片资源数组。所以LandStylePic也要被实例化了,自然,那么在MapsEditorFrame要建立一个LandStylePic的对象了,所以也要小小的修改下,就给出两个文件的修改后代码吧:

LandStylePic:

/**
 * 记录地图类型存储的类
 *
 *
*/

import  javax.swing.ImageIcon;
import  java.util. * ;
import  java.io. * ;

public   final   class  LandStylePic  {
    
// 存放地形图形的数组
    /*public final static ImageIcon[] LANDSTYLES = {
        new ImageIcon("../mapResource/water/water_left.PNG"),
        new ImageIcon("../mapResource/water/water_middle.PNG"),
        new ImageIcon("../mapResource/water/water_right.PNG"),
        new ImageIcon("../mapResource/water/water_blue.PNG"),
        new ImageIcon("../mapResource/water/water.PNG"),
        new ImageIcon("../mapResource/mountain/山.PNG"),
        new ImageIcon("../mapResource/grass/草.PNG"),
    };
*/

    
public static ImageIcon[] LANDSTYLES;
    
public LandStylePic () throws FileNotFoundException, IOException {
        LANDSTYLES 
= 
        (
new MapResourceFileReader("../mapResource/mapR.txt")).getImageIconArray();
    
    }

    
// 存放地形相关信息的数据结构的数组
    public final static MapsConstruction[] MAPCONS = {
        
new MapsConstruction(0'A'"water_left"
                
"水地形的左边部分,两栖物种以及飞行物种可登陆"),
        
new MapsConstruction(1'B'"water_middle",
                
"水地形的中间部分,两栖物种以及飞行物种可登陆"),
        
new MapsConstruction(2'C'"water_right",
                
"水地形的右边部分,两栖物种以及飞行物种可登陆"),
        
new MapsConstruction(3'D'"water_blue",
                
"水地形的反光部分,两栖物种以及飞行物种可登陆"),
        
new MapsConstruction(4'E'"water",
                
"水地形的反光部分,两栖物种以及飞行物种可登陆"),
        
new MapsConstruction(5'F'"土山",
                
"山地,只能放在草地之上飞行物种可登陆"),
        
new MapsConstruction(6'G'"",
                
"草地中心,任何物种能登陆"),
        
new MapsConstruction(7'H'"leftup"""),
        
new MapsConstruction(8'I'"up"""),
        
new MapsConstruction(9'J'"rightup"""),
        
new MapsConstruction(10'K'"right"""),
        
new MapsConstruction(11'L'"rightdown"""),
        
new MapsConstruction(12'M'"down"""),
        
new MapsConstruction(13'N'"leftdown"""),
        
new MapsConstruction(14'O'"left"""),
    }
;
    
/**
     * Method main
     *
     *
     * 
@param args
     *
     
*/

    
public static void main(String[] args) {
        
// TODO: 在这添加你的代码
    }


    
/**
     * Method getIndex
     *
     *
     * 
@param name
     *
     * 
@return
     *
     
*/

    
public static int getIndex(String name) {
        
// TODO: 在这添加你的代码
        for(int i = 0; i < MAPCONS.length; i++{
            
if( name.equals( MAPCONS[i].getName() ) )
            
{
                
return MAPCONS[i].getIndex();
            }

        }

        
return -1;
    }


    
/**
     * Method getIndex
     *
     *
     * 
@param mark
     *
     * 
@return
     *
     
*/

    
public static int getIndex(char mark) {
        
// TODO: 在这添加你的代码
        for(int i = 0; i < MAPCONS.length; i++{
            
if ( mark == MAPCONS[i].getMarks() ) {
                
return MAPCONS[i].getIndex();
            }

        }

        
return -1;
    }
    
}

这个是吧,其实应该把对应的那个数组也存到文件中去,这里因为只是测试下用的,所以就没动了,还很不完善那~呵呵。

MapsEditorFrame:

import  java.awt. * ;
import  java.awt.event. * ;
import  javax.swing. * ;
import  java.util. * ;
import  java.io. * ;

/**
 * Sample application using JFrame.
 *
 * 
@author SosoAyaen
 * 
@version 1.00 06/08/10
 
*/

public   class  MapsEditorFrame  extends  JFrame  implements  ActionListener {
   
    
// 容器组件等
    private JButton jbOK = null, jbCancel = null, jbIcon = null,
                    jbSave 
= null, jbLoadMapFromFile = null;
    
private JPanel jpCenter = null, jpIcon = null, jpSouth = null,
                    jpNorth 
= null, jpEast = null, jpEastCo = null;
    
private JLabel jlMap = null, jlTitle = null, jlTips = null;
    
private JMenu jmenu = null;
    
private JMenuItem jmiExit = null;
    
private JMenuBar jmb = null;
    
    
private JTextField jtf = null;
    
private int change = 1;            // 控制点击同一按钮后控制不同控件
    
    
// 临时测试用的地图文件数组
    private char[] maps;
    
    
// 随机数
    private Random rand = new Random();
    
private int WIDTH = 5, HEIGHT = 5;
    
private final String mapFilePath = "../mapFile/";
    
// private Dimension d = null;
    
     
/**
     * The constructor.
     
*/
  
    
public MapsEditorFrame (String title) throws FileNotFoundException, IOException {
        
super(title);
        LandStylePic ls 
= new LandStylePic();
        
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        
// 载入地图文件
        try {        
            MapFileReader mfr 
= new MapFileReader (mapFilePath + "map1.txt");
            maps 
= mfr.getMapFileToString().toCharArray();
            
this.setMapSize (mfr.getMapX(), mfr.getMapY());
            mfr.close();
        }

        
catch (FileNotFoundException e)
        
{
            e.printStackTrace();
        }

        
catch (IOException e)
        
{
            e.printStackTrace();
        }

            
        
        
// d = new Dimension(11, 20);
        
        
// JMenu
        JMenu jmFile = new JMenu("文件");
        
// 临时定义组件
        JMenuItem jmiLoad = new JMenuItem("载入地图");
        jmiLoad.addActionListener(
this);
        jmFile.add(jmiLoad);
        
        jmiExit 
= new JMenuItem("退出");
        jmiExit.addActionListener(
this);
        
        jmFile.add(jmiExit);
        
        JMenu jmEdit 
= new JMenu("编辑");
        JMenuItem jmiUndo 
= new JMenuItem("撤销");
        jmEdit.add(jmiUndo);
        
        
// JMenuBar
        jmb = new JMenuBar();
        jmb.add(jmFile);
        jmb.add(jmEdit);
        
this.setJMenuBar(jmb);
        
        
// JTextField
        jtf = new JTextField(10);
        jtf.setEditable(
false);
        
        
// JLabel
        
// jlMap = new JLabel(mapsWater[0]);
        jlTitle = new JLabel("SLG地图编辑器");
        jlTips 
= new JLabel();
        
        
// JButton
        jbLoadMapFromFile = new JButton("Load Maps");
        jbLoadMapFromFile.addActionListener(
this);
        jbSave 
= new JButton("Save Maps");
        jbSave.addActionListener(
this);
        jbOK 
= new JButton("OK");
        
// jbOK.setMaximumSize(new Dimension(6, 12));
        jbOK.addActionListener(this);
        
        
// jbOK.setSize(d);
        jbCancel = new JButton("Cancel");
        jbCancel.setEnabled(
false);        
        jbIcon 
= new JButton("WaterMiddle"
            ls.LANDSTYLES[LandStylePic.getIndex(
"water_right")]);
        
        
// JPanel
        jpSouth = new JPanel(new FlowLayout());
        jpSouth.add(jbOK);
        jpSouth.add(jbCancel);
            
        jpNorth 
= new JPanel(new FlowLayout());
        jpNorth.add(jlTitle);
            
        jpEast 
= new JPanel(new GridLayout(0,1));
        
        jpEastCo 
= new JPanel(new FlowLayout());
        jpEastCo.add(jbIcon);
        jpEast.add(jpEastCo);
        
        jpEastCo 
= new JPanel(new FlowLayout());
        jpEastCo.add(jbSave);
        jpEast.add(jpEastCo);
        
        jpEastCo 
= new JPanel(new FlowLayout());
        jpEastCo.add(jbLoadMapFromFile);
        jpEast.add(jpEastCo);
        
        jpEastCo 
= new JPanel(new FlowLayout());
        jpEastCo.add(jtf);
        jpEast.add(jpEastCo);
        
        jpEastCo 
= new JPanel(new FlowLayout());
        jpEastCo.add(jlTips);
        jpEast.add(jpEastCo);
                
        jpIcon 
= new JPanel(new GridLayout(HEIGHT,WIDTH,0,0));
        
/*
        for(int i = 0, j = 0; i<HEIGHT*WIDTH; i++)
        {
            j = rand.nextInt(4);
            jlMap = new JLabel(LandStylePic.LANDSTYLES[j]);
            jpIcon.add(jlMap);
        }
        //
*/

        
        
// 按数组内容添加地图图片
        for (int i = 0; i < HEIGHT*WIDTH; i++{
            jlMap 
= new JLabel( ls.LANDSTYLES[LandStylePic.getIndex(maps[i])] );
            jpIcon.add(jlMap);
        }

        
// 保证jpIcon内的JLabel不会因为外部窗口的拉伸而走样
        jpCenter = new JPanel(new FlowLayout());
        jpCenter.add(jpIcon);
        
        
// JFrame
        this.setLayout(new BorderLayout());
        
this.setSize(500500);
        
this.setResizable(true);
        
this.add(BorderLayout.NORTH, jpNorth);
        
this.add(BorderLayout.SOUTH, jpSouth);
        
this.add(BorderLayout.CENTER, jpCenter);
        
this.add(BorderLayout.EAST, jpEast);
    }

    
    
/**
     * Method setMapSize
     *
     *
     * 
@param x
     * 
@param y
     *
     
*/

    
public void setMapSize (int x, int y) {
        
// TODO: 在这添加你的代码
        this.WIDTH = x;
        
this.HEIGHT = y;
    }

    
    
/**
     * Method actionPerformed
     *
     *
     * 
@param e
     *
     
*/

    
public void actionPerformed(ActionEvent e) {
        
// TODO: 在这添加你的代码
        if (e.getActionCommand().equals("OK"))
        
{
            System.exit(
0);
        }

        
else if(e.getActionCommand().equals("Save Maps"))
        
{
            change 
*= -1;
            
if(change > 0)
            
{
                jtf.setText(
"TEST");
                jlTips.setText(
"");
            }

            
else
            
{
                jlTips.setText(
"Two pigs");
                jtf.setText(
"");
            }

        }

        
else if (e.getActionCommand().equals("Load Maps"|| e.getActionCommand().equals("载入地图"))
        
{
            System.out.println(
"Map loaded...");
        }

        
else if (e.getActionCommand().equals("退出"))
        
{
            System.exit(
0);
        }

    }


}

其实也真的没什么大修改,就加了个ls而已。不过还是全帖出来吧,怕说不清楚,自己看也好,呵呵。争取下次把控制地图的做好,真正实现免编译。啊~又快凌晨5点了,睡觉去咯~~

 唠叨几句:为了发这几篇学习笔记我真的快被CSDN的BLOG玩死了,不是发了慢就是分类上根本就没显示,还有就是发布了不能修改,看看前几篇我还没用代码优化的时候的帖子,惨不忍睹啊!编辑不能,我能有什么办法……这文章是昨天发的,可是到了今天我还是没有看到发布到外面去,没办法了,重发……快顶不住了!有时候浩浩汤汤写了好多,可就是被OB在一瞬间了……此之痛,无与伦比;特别是我等凌晨活动的人来说,一个晚上白忙活真够残忍的…… 这篇文章就有这么难发么?4遍了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值