精华内容
参与话题
问答
  • Java实现在线预览--openOffice实现

    万次阅读 多人点赞 2019-07-31 18:39:57
    Java实现在线预览–openOffice实现

    #Java实现在线预览–openOffice实现
    ##简介
    之前有写了poi实现在线预览的文章,里面也说到了使用openOffice也可以做到,这里就详细介绍一下。
    我的实现逻辑有两种:
    一、利用jodconverter(基于OpenOffice服务)将文件(.doc、.docx、.xls、.ppt)转化为html格式。
    二、利用jodconverter(基于OpenOffice服务)将文件(.doc、.docx、.xls、.ppt)转化为pdf格式。
    转换成html格式大家都能理解,这样就可以直接在浏览器上查看了,也就实现了在线预览的功能;转换成pdf格式这点,需要用户安装了Adobe Reader XI,这样你会发现把pdf直接拖到浏览器页面可以直接打开预览,这样也就实现了在线预览的功能。
    ##将文件转化为html格式或者pdf格式
    话不多说,直接上代码。

    package com.pdfPreview.util;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ConnectException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import com.artofsolving.jodconverter.DocumentConverter;
    import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
    import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
    import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
    /**
     * 利用jodconverter(基于OpenOffice服务)将文件(*.doc、*.docx、*.xls、*.ppt)转化为html格式或者pdf格式,
     * 使用前请检查OpenOffice服务是否已经开启, OpenOffice进程名称:soffice.exe | soffice.bin
     * 
     * @author yjclsx
     */
    public class Doc2HtmlUtil {
    
    	private static Doc2HtmlUtil doc2HtmlUtil;
    
    	/**
    	 * 获取Doc2HtmlUtil实例
    	 */
    	public static synchronized Doc2HtmlUtil getDoc2HtmlUtilInstance() {
    		if (doc2HtmlUtil == null) {
    			doc2HtmlUtil = new Doc2HtmlUtil();
    		}
    		return doc2HtmlUtil;
    	}
    
    	/**
    	 * 转换文件成html
    	 * 
    	 * @param fromFileInputStream:
    	 * @throws IOException 
    	 */
    	public String file2Html(InputStream fromFileInputStream, String toFilePath,String type) throws IOException {
    		Date date = new Date();
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    		String timesuffix = sdf.format(date);
    		String docFileName = null;
    		String htmFileName = null;
    		if("doc".equals(type)){
    			docFileName = "doc_" + timesuffix + ".doc";
    			htmFileName = "doc_" + timesuffix + ".html";
    		}else if("docx".equals(type)){
    			docFileName = "docx_" + timesuffix + ".docx";
    			htmFileName = "docx_" + timesuffix + ".html";
    		}else if("xls".equals(type)){
    			docFileName = "xls_" + timesuffix + ".xls";
    			htmFileName = "xls_" + timesuffix + ".html";
    		}else if("ppt".equals(type)){
    			docFileName = "ppt_" + timesuffix + ".ppt";
    			htmFileName = "ppt_" + timesuffix + ".html";
    		}else{
    			return null;
    		}
    
    		File htmlOutputFile = new File(toFilePath + File.separatorChar + htmFileName);
    		File docInputFile = new File(toFilePath + File.separatorChar + docFileName);
    		if (htmlOutputFile.exists())
    			htmlOutputFile.delete();
    		htmlOutputFile.createNewFile();
    		if (docInputFile.exists())
    			docInputFile.delete();
    		docInputFile.createNewFile();
    		/**
    		 * 由fromFileInputStream构建输入文件
    		 */
    		try {
    			OutputStream os = new FileOutputStream(docInputFile);
    			int bytesRead = 0;
    			byte[] buffer = new byte[1024 * 8];
    			while ((bytesRead = fromFileInputStream.read(buffer)) != -1) {
    				os.write(buffer, 0, bytesRead);
    			}
    
    			os.close();
    			fromFileInputStream.close();
    		} catch (IOException e) {
    		}
    	
    	    OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
    		try {
    			connection.connect();
    		} catch (ConnectException e) {
    			System.err.println("文件转换出错,请检查OpenOffice服务是否启动。");
    		}
    		// convert
    		DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
    		converter.convert(docInputFile, htmlOutputFile);
    		connection.disconnect();
    		// 转换完之后删除word文件
    		docInputFile.delete();
    		return htmFileName;
    	}
    	
    	/**
    	 * 转换文件成pdf
    	 * 
    	 * @param fromFileInputStream:
    	 * @throws IOException 
    	 */
    	public String file2pdf(InputStream fromFileInputStream, String toFilePath,String type) throws IOException {
    		Date date = new Date();
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    		String timesuffix = sdf.format(date);
    		String docFileName = null;
    		String htmFileName = null;
    		if("doc".equals(type)){
    			docFileName = "doc_" + timesuffix + ".doc";
    			htmFileName = "doc_" + timesuffix + ".pdf";
    		}else if("docx".equals(type)){
    			docFileName = "docx_" + timesuffix + ".docx";
    			htmFileName = "docx_" + timesuffix + ".pdf";
    		}else if("xls".equals(type)){
    			docFileName = "xls_" + timesuffix + ".xls";
    			htmFileName = "xls_" + timesuffix + ".pdf";
    		}else if("ppt".equals(type)){
    			docFileName = "ppt_" + timesuffix + ".ppt";
    			htmFileName = "ppt_" + timesuffix + ".pdf";
    		}else{
    			return null;
    		}
    
    		File htmlOutputFile = new File(toFilePath + File.separatorChar + htmFileName);
    		File docInputFile = new File(toFilePath + File.separatorChar + docFileName);
    		if (htmlOutputFile.exists())
    			htmlOutputFile.delete();
    		htmlOutputFile.createNewFile();
    		if (docInputFile.exists())
    			docInputFile.delete();
    		docInputFile.createNewFile();
    		/**
    		 * 由fromFileInputStream构建输入文件
    		 */
    		try {
    			OutputStream os = new FileOutputStream(docInputFile);
    			int bytesRead = 0;
    			byte[] buffer = new byte[1024 * 8];
    			while ((bytesRead = fromFileInputStream.read(buffer)) != -1) {
    				os.write(buffer, 0, bytesRead);
    			}
    
    			os.close();
    			fromFileInputStream.close();
    		} catch (IOException e) {
    		}
    
    		OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
    		try {
    			connection.connect();
    		} catch (ConnectException e) {
    			System.err.println("文件转换出错,请检查OpenOffice服务是否启动。");
    		}
    		// convert
    		DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
    		converter.convert(docInputFile, htmlOutputFile);
    		connection.disconnect();
    		// 转换完之后删除word文件
    		docInputFile.delete();
    		return htmFileName;
    	}
    	
    	public static void main(String[] args) throws IOException {
    		Doc2HtmlUtil coc2HtmlUtil = getDoc2HtmlUtilInstance();
    		File file = null;
    		FileInputStream fileInputStream = null;
    		
    		file = new File("D:/poi-test/exportExcel.xls");
    		fileInputStream = new FileInputStream(file);
    //		coc2HtmlUtil.file2Html(fileInputStream, "D:/poi-test/openOffice/xls","xls");
    		coc2HtmlUtil.file2pdf(fileInputStream, "D:/poi-test/openOffice/xls","xls");
    		
    		file = new File("D:/poi-test/test.doc");
    		fileInputStream = new FileInputStream(file);
    //		coc2HtmlUtil.file2Html(fileInputStream, "D:/poi-test/openOffice/doc","doc");
    		coc2HtmlUtil.file2pdf(fileInputStream, "D:/poi-test/openOffice/doc","doc");
    		
    		file = new File("D:/poi-test/周报模版.ppt");
    		fileInputStream = new FileInputStream(file);
    //		coc2HtmlUtil.file2Html(fileInputStream, "D:/poi-test/openOffice/ppt","ppt");
    		coc2HtmlUtil.file2pdf(fileInputStream, "D:/poi-test/openOffice/ppt","ppt");
    		
    		file = new File("D:/poi-test/test.docx");
    		fileInputStream = new FileInputStream(file);
    //		coc2HtmlUtil.file2Html(fileInputStream, "D:/poi-test/openOffice/docx","docx");
    		coc2HtmlUtil.file2pdf(fileInputStream, "D:/poi-test/openOffice/docx","docx");
    		
    	}
    
    }
    

    转换成html和转换成pdf的过程几乎一样,只是在创建输出的File时前者命名为XXX.html,后者命名为XXX.pdf,在执行converter.convert(docInputFile, htmlOutputFile);时,jodconverter会自己根据文件类型名转换成对应的文件。
    注意,main方法里别file2Html和file2pdf都调用,会报错的,要么转html,要么转pdf,只能选一个。还有就是在执行之前,需要启动openOffice的服务:在openOffice目录下的命令窗口中执行soffice -headless -accept=“socket,host=127.0.0.1,port=8100;urp;” -nofirststartwizard即可启动。
    以上需要引入jodconverter的jar包。

    展开全文
  • java实现在线预览--poi实现word、excel、ppt转html

    万次阅读 多人点赞 2019-07-31 18:39:43
    java实现在线预览- -之poi实现word、excel、ppt转html

    java实现在线预览

    - -之poi实现word、excel、ppt转html

    ###简介
    java实现在线预览功能是一个大家在工作中也许会遇到的需求,如果公司有钱,直接使用付费的第三方软件或者云在线预览服务就可以了,例如永中office、office web 365(http://www.officeweb365.com/)他们都有云在线预览服务,就是要钱0.0
    如果想要免费的,可以用openoffice,还需要借助其他的工具(例如swfTools、FlexPaper等)才行,可参考这篇文章http://blog.csdn.net/z69183787/article/details/17468039,写的挺细的,实现原理就是:
    1.通过第三方工具openoffice,将word、excel、ppt、txt等文件转换为pdf文件;
    2.通过swfTools将pdf文件转换成swf格式的文件;
    3.通过FlexPaper文档组件在页面上进行展示。
    当然如果装了Adobe Reader XI,那把pdf直接拖到浏览器页面就可以直接打开预览,这样就不需要步骤2、3了,前提就是客户装了Adobe Reader XI这个pdf阅读器。
    我这里介绍通过poi实现word、excel、ppt转html,这样就可以放在页面上了。

    ###word转html

    package wordToHtml;
    
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.util.List;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    import org.apache.commons.io.FileUtils;
    import org.apache.poi.hwpf.HWPFDocument;
    import org.apache.poi.hwpf.converter.PicturesManager;
    import org.apache.poi.hwpf.converter.WordToHtmlConverter;
    import org.apache.poi.hwpf.usermodel.Picture;
    import org.apache.poi.hwpf.usermodel.PictureType;
    import org.w3c.dom.Document;
    public class PoiWordToHtml {
     public static void main(String[] args) throws Throwable {
      final String path = "D:\\poi-test\\wordToHtml\\";
      final String file = "人员选择系分.doc";
      InputStream input = new FileInputStream(path + file);
      HWPFDocument wordDocument = new HWPFDocument(input);
      WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
        DocumentBuilderFactory.newInstance().newDocumentBuilder()
          .newDocument());
      wordToHtmlConverter.setPicturesManager(new PicturesManager() {
       public String savePicture(byte[] content, PictureType pictureType,
         String suggestedName, float widthInches, float heightInches) {
        return suggestedName;
       }
      });
      wordToHtmlConverter.processDocument(wordDocument);
      List pics = wordDocument.getPicturesTable().getAllPictures();
      if (pics != null) {
       for (int i = 0; i < pics.size(); i++) {
        Picture pic = (Picture) pics.get(i);
        try {
         pic.writeImageContent(new FileOutputStream(path
           + pic.suggestFullFileName()));
        } catch (FileNotFoundException e) {
         e.printStackTrace();
        }
       }
      }
      Document htmlDocument = wordToHtmlConverter.getDocument();
      ByteArrayOutputStream outStream = new ByteArrayOutputStream();
      DOMSource domSource = new DOMSource(htmlDocument);
      StreamResult streamResult = new StreamResult(outStream);
      TransformerFactory tf = TransformerFactory.newInstance();
      Transformer serializer = tf.newTransformer();
      serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
      serializer.setOutputProperty(OutputKeys.INDENT, "yes");
      serializer.setOutputProperty(OutputKeys.METHOD, "html");
      serializer.transform(domSource, streamResult);
      outStream.close();
      String content = new String(outStream.toByteArray());
      FileUtils.writeStringToFile(new File(path, "人员选择系分.html"), content, "utf-8");
     }
    }
    

    ###excel转html

    package excelToHtml;
    
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.poi.hssf.converter.ExcelToHtmlConverter;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hwpf.converter.PicturesManager;
    import org.apache.poi.hwpf.converter.WordToHtmlConverter;
    import org.apache.poi.hwpf.usermodel.Picture;
    import org.apache.poi.hwpf.usermodel.PictureType;
    import org.w3c.dom.Document;
    
    
    public class PoiExcelToHtml {
    	final static String path = "D:\\poi-test\\excelToHtml\\";
    	 final static String file = "exportExcel.xls";
     public static void main(String args[]) throws Exception {
    	 
    	 InputStream input=new FileInputStream(path+file);
    	 HSSFWorkbook excelBook=new HSSFWorkbook(input);
    	 ExcelToHtmlConverter excelToHtmlConverter = new ExcelToHtmlConverter (DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument() );
    	 excelToHtmlConverter.processWorkbook(excelBook);
    	 List pics = excelBook.getAllPictures();
         if (pics != null) {
             for (int i = 0; i < pics.size(); i++) {
                 Picture pic = (Picture) pics.get (i);
                 try {
                     pic.writeImageContent (new FileOutputStream (path + pic.suggestFullFileName() ) );
                 } catch (FileNotFoundException e) {
                     e.printStackTrace();
                 }
             }
         }
         Document htmlDocument =excelToHtmlConverter.getDocument();
         ByteArrayOutputStream outStream = new ByteArrayOutputStream();
         DOMSource domSource = new DOMSource (htmlDocument);
         StreamResult streamResult = new StreamResult (outStream);
         TransformerFactory tf = TransformerFactory.newInstance();
         Transformer serializer = tf.newTransformer();
         serializer.setOutputProperty (OutputKeys.ENCODING, "utf-8");
         serializer.setOutputProperty (OutputKeys.INDENT, "yes");
         serializer.setOutputProperty (OutputKeys.METHOD, "html");
         serializer.transform (domSource, streamResult);
         outStream.close();
    
         String content = new String (outStream.toByteArray() );
    
         FileUtils.writeStringToFile(new File (path, "exportExcel.html"), content, "utf-8");
     }
    }
    

    ###ppt转html
    其实只是ppt转图片,有了图片后放到页面上去,点击下一页就一张张显示就可以了。这里只介绍ppt转图片的过程。

    package pptToImg;
    
    import java.awt.Dimension;   
    import java.io.File;   
    import java.io.FileInputStream;   
    import java.io.FileNotFoundException;   
    import java.io.FileOutputStream;   
    import java.io.IOException;   
      
    import java.awt.Color;   
    import java.awt.Dimension;   
    import java.awt.Graphics2D;   
    import java.awt.geom.Rectangle2D;   
    import java.awt.image.BufferedImage;   
      
    import org.apache.poi.hslf.model.TextRun;   
    import org.apache.poi.hslf.record.Slide;   
    import org.apache.poi.hslf.usermodel.RichTextRun;   
    import org.apache.poi.hslf.usermodel.SlideShow;   
      
    public class PPTtoImage {   
        public static void main(String[] args) {   
            // 读入PPT文件   
            File file = new File("D:/poi-test/pptToImg/test.ppt");   
            doPPTtoImage(file);   
        }   
      
        public static boolean doPPTtoImage(File file) {   
            boolean isppt = checkFile(file);   
            if (!isppt) {   
                System.out.println("The image you specify don't exit!");   
                return false;   
            }   
            try {   
      
                FileInputStream is = new FileInputStream(file);   
                SlideShow ppt = new SlideShow(is);   
                is.close();   
                Dimension pgsize = ppt.getPageSize();   
                org.apache.poi.hslf.model.Slide[] slide = ppt.getSlides();   
                for (int i = 0; i < slide.length; i++) {   
                    System.out.print("第" + i + "页。");   
                       
                    TextRun[] truns = slide[i].getTextRuns();      
                    for ( int k=0;k<truns.length;k++){      
                       RichTextRun[] rtruns = truns[k].getRichTextRuns();      
                      for(int l=0;l<rtruns.length;l++){      
                           int index = rtruns[l].getFontIndex();      
                            String name = rtruns[l].getFontName();                
                            rtruns[l].setFontIndex(1);      
                            rtruns[l].setFontName("宋体");  
    //                        System.out.println(rtruns[l].getText());
                       }      
                    }      
                    BufferedImage img = new BufferedImage(pgsize.width,pgsize.height, BufferedImage.TYPE_INT_RGB);   
      
                    Graphics2D graphics = img.createGraphics();   
                    graphics.setPaint(Color.BLUE);   
                    graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));   
                    slide[i].draw(graphics);   
      
                    // 这里设置图片的存放路径和图片的格式(jpeg,png,bmp等等),注意生成文件路径   
                    FileOutputStream out = new FileOutputStream("D:/poi-test/pptToImg/pict_"+ (i + 1) + ".jpeg");   
                    javax.imageio.ImageIO.write(img, "jpeg", out);   
                    out.close();   
      
                }   
                System.out.println("success!!");   
                return true;   
            } catch (FileNotFoundException e) {   
                System.out.println(e);   
                // System.out.println("Can't find the image!");   
            } catch (IOException e) {   
            }   
            return false;   
        }   
      
        // function 检查文件是否为PPT   
        public static boolean checkFile(File file) {   
      
            boolean isppt = false;   
            String filename = file.getName();   
            String suffixname = null;   
            if (filename != null && filename.indexOf(".") != -1) {   
                suffixname = filename.substring(filename.indexOf("."));   
                if (suffixname.equals(".ppt")) {   
                    isppt = true;   
                }   
                return isppt;   
            } else {   
                return isppt;   
            }   
        }   
      
    }  
    

    ppt转图片有个缺陷,就是ppt里不是宋体的字有些可能会变成框框。
    以上都需要引入poi的jar包。
    要实现在线预览,只需把转换得到的html在新标签页打开或者镶嵌到某块区域就可以展现了。

    展开全文
  • java实现的坦克大战

    万次阅读 多人点赞 2018-01-03 13:38:16
    Java实现的坦克大战》 实现的功能 1、单人模式 2、双人模式 3、通过深度优先算法实现的AI坦克寻路功能

    源码获取途径:

    • 1.百度云链接: https://pan.baidu.com/s/1UK9FIgEztKINHog7Y6r0uw 提取码: eaus
    • 2.可以到我的GitHub上面拉取项目
    • 3.直接下载(下载链接:https://github.com/ddddyyyy/TankBattle/archive/master.zip)

    一. 程序基本结构

    基本结构


    二. 实现的功能

    1、单人模式
    2、双人模式
    3、通过广度优先算法实现坦克寻路功能


    三. 运行效果

    主界面
    运行


    四. 实现思路

    1. 数据存储表示: 在JPanel绘制图像,统一规定各个方块的大小为同一大小(如墙壁,坦克之类,子弹除外),从而方便使用二维数组存储地图的各个元素。
    2. 关于检测物体碰撞,这里使用了一个MyImage的父类,将坦克,墙壁
      定义为继承这个父类的一个类。
    class MyImage {
        int width = Game.width;
        int height = Game.height;
        //二维地图的坐标
        Coord coord;
        //屏幕上的像素坐标
        int x;
        int y;
        MyImage(Coord coord) {
            x = coord.x * width;
            y = coord.y * height;
            this.coord = coord;
        }
        private Rectangle getRect() {
            return new Rectangle(x, y, width, height);
        }
        //碰撞检测
        boolean isIntersects(MyImage other) {
            return other.getRect().intersects(getRect());
        }
    }
    
    1. 图像打印则借助遍历两个ConcurrentHashMap分别储存坦克和其他类型的方块。将这些方块使用Map而不是使用数组是因为管理起来比较方便,而二维数组则是为了寻路算法而准备的,防止了频繁使用上面的两个Map而导致线程锁的问题。

    五. 遇到的问题

    1. java的按键监听在响应按键长按时会有1-2秒的延迟,导致操作手感极差
      解决方法:在坦克类中设置一个布尔属性move以及整形变量key储存键入的按键值,创建一个线程来响应按键。

    实现代码:

    //按键响应的线程类
    class MyTankMove implements Runnable{
    	public void run(){
    		while(flag){
    				GetKey(key);
    			while(move){//决定是否移动
    				try {
    					e.printStackTrace();
    					Thread.sleep(100);
    				} catch (InterruptedException e) {
    				e.printStackTrace();
    				}
    			try {
    				Thread.sleep(10);//防止无按键时陷入死循环导致线程堵塞
    			} catch (InterruptedException e) {
    			}
    			}
    	}
    

    按键监听事件,即给key和move赋值

    //按键监听接口
    private class KeyBoradListener extends KeyAdapter{
    public void keyPressed(KeyEvent e){
    	super.keyPressed(e);
    	int key = e.getKeyCode();
    	if(key<65){//为了实现双人对战而设置的。。。
    		if(key!=KeyEvent.VK_SHIFT&&!MyTank.isEmpty()){
    			MyTank.getFirst().key=key;
    			MyTank.getFirst().move=true;
    		}
    	}
    	else{
    		if(key!=KeyEvent.VK_G&&!MyTank.isEmpty()){
    			switch (key){
    			case KeyEvent.VK_W:key = KeyEvent.VK_UP;break;
    			case KeyEvent.VK_A:key = KeyEvent.VK_LEFT;break;
    			case KeyEvent.VK_S:key = KeyEvent.VK_DOWN;break;
    			case KeyEvent.VK_D:key = KeyEvent.VK_RIGHT;break;
    			}
    			MyTank.getLast().key=key;
    			MyTank.getLast().move=true;
    		}
    	}
    }
    public void keyReleased(KeyEvent e){
    	super.keyReleased(e);
    	int key = e.getKeyCode();
    	if(key<65){
    		if(!MyTank.isEmpty()){
    			if(key!=KeyEvent.VK_SHIFT&&key==MyTank.getFirst().key){//避免了同时按两个以上按键后会卡住
    				MyTank.getFirst().move=false;
    			}
    			else{
    				MyTank.getFirst().GetKey(key);
    			}
    		}
    	}
    	else{
    		switch (key){
    		case KeyEvent.VK_W:key = KeyEvent.VK_UP;break;
    		case KeyEvent.VK_A:key = KeyEvent.VK_LEFT;break;
    		case KeyEvent.VK_S:key = KeyEvent.VK_DOWN;break;
    		case KeyEvent.VK_D:key = KeyEvent.VK_RIGHT;break;
    		case KeyEvent.VK_G:key = KeyEvent.VK_SHIFT;break;
    		}
    		if(!MyTank.isEmpty()){
    			if(key!=KeyEvent.VK_SHIFT&&key==MyTank.getLast().key){
    				MyTank.getLast().move=false;
    			}
    			else{
    				MyTank.getLast().GetKey(key);
    			}
    		}
    	}
    }
    }
    

    1. 项目内的图片资源如何在项目导出后也能使用
      解决方法:假设在项目的scr文件夹中建立img文件夹,在项目的.classpath中加一句<classpathentry kind="src" path="src/img"/>(Eclipse),也可以通过设置项目的Modules,将图像文件夹设置为resources(IDEA),并使用当前类的名.class.getResource("/(文件名)")).getImage()获得图像对象。

    1. 寻路的实现
      实现思路:通过使用一个存储了地图内各个元素的二维数组Game.map,使用广度优先算法遍历出一条路线,将结果存放于栈之中。
      实现代码:
     /**
      * 使用广度遍历算法,使用队列存储遍历的节点
      *
      * @return 移动的路径
      */
     private Stack<Coord> GetPath() {
         Coord target = Game.tanks.get(Game.P1_TAG).coord;
         Queue<Coord> d_q = new LinkedBlockingQueue<>();
         ArrayList<Coord> IsMove = new ArrayList<>();
         d_q.offer(coord);
         IsMove.add(coord);
         Coord last = null;
         boolean flag;
         while (!d_q.isEmpty()) {
             Coord t = d_q.poll();
             int tx = t.x;
             int ty = t.y;
             int i;
             //遍历所有的方向
             for (i = 0; i < 4; ++i) {
                 switch (i) {
                     case Game.UP:
                         ty -= 1;
                         break;
                     case Game.LEFT:
                         tx -= 1;
                         break;
                     case Game.RIGHT:
                         tx += 1;
                         break;
                     case Game.DOWN:
                         ty += 1;
                         break;
                 }
                 //判断该点是否可行
                 flag = true;
                 Coord z = new Coord(tx, ty);
                 //检查是否为目标终点
                 if (z.equals(target)) {
                     z.per = t;
                     last = z;
                     break;
                 }
                 //检查该坐标是否已经遍历了
                 for (Coord c : IsMove) {
                     if (c.equals(z)) {
                         flag = false;
                         break;
                     }
                 }
                 if (flag) {
                     //检查下一格是否可以抵达
                     flag =(Game.map[ty][tx] == Game.BLANK || Game.map[ty][tx] == Game.WALLS);
                 }
                 //该点可以用
                 if (flag) {
                     //将坐标纳入已经遍历的队列中
                     d_q.offer(z);
                     IsMove.add(z);
                     z.per = t;
                     last = z;
                 }
                 IsMove.add(z);
                 //重新选择方向遍历
                 tx = t.x;
                 ty = t.y;
             }
             //如果没有四个方向都遍历完就跳出,说明已经找到了终点
             if (i != 4) {
                 break;
             }
         }
         Stack<Coord> coords = new Stack<>();
         while (null != last && last.per != null) {
             coords.push(last);
             last = last.per;
         }
         return coords;
     }
    

    展开全文
  • Java进阶(十八)Java实现定时器(Timer)

    万次阅读 2015-11-24 08:10:43
    Java实现定时器(Timer) 绪 在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。java.util这个包中可以找到Timer和TimerTask...

    Java实现定时器(Timer)

    在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。java.util这个包中可以找到Timer和TimerTask这两个类。Timer直接从Object继承,它相当于一个计时器,能够用它来指定某个时间来执行一项任务,或者每隔一定时间间隔反复执行同一个任务。创建一个Timer后,就会生成一个线程在背后运行,来控制任务的执行。而TimerTask就是用来实现某项任务的类,它实现了Runnable接口,因此相当于一个线程。

    步骤:

    第一步:编写测试类,该类extends TimerTask,重新run()方法,run方法里面就是你要执行的逻辑代码,示例如下:

     

    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.TimerTask;
    public class MyTest1 extends TimerTask {
       private SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
     @Override
     public void run() {
         System.out.println("现在时间是:"+sf.format(new Date()));
     }
    }

     

    第二步:编写一个类,该类实现ServletContextListener接口

     

    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    public class TimerTaskManager implements ServletContextListener {
    private Timer timer;
     @Override
     public void contextInitialized(ServletContextEvent sce) {
      System.out.println("程序定时执行任务.....................................");
      MyTest1 t=new MyTest1();
      timer=new Timer("开始执行任务",true);
    /* 执行MyTest1中的run方法,t代表TimerTask的子类,0代表延迟0毫秒执行run方 * 法,1000表示每隔一秒执行一次run方法,后面两个参数可根据自己的需求而定义
    */
      timer.schedule(t, 0, 1000);
     }
     @Override
     public void contextDestroyed(ServletContextEvent sce) {
      System.out.println("程序定时执行任务结束.....................................");
      timer.cancel();
     }
    }

     

    第三步:在web.xml中添加如下代码里面填写TimerTaskManager的路径,程序在web容器启动后会初始化加载TimerTaskManager的contextInitialized方法。

    监听器添加方式:

    加listener标签,listener里面加listener-class标签,listener-class标签里面内容为TimerTaskManager的路径,如:com.TimerTaskManager.

    举例:

    <listener>
    <listener-class>weiming.lmapp.timer.SysContextListener</listener-class>
    </listener>

    相关注意点分析:

    1、任务调度要优先考虑实时保证

    由于Java的天性,并且在开发JDK的过程中要考虑到不同平台,而不同平台的线程调度机制是不同的,因此各种平台下JVM 的线程调度机制也是不一致的。从而Timer不能保证任务在所指定的时间内执行。另外由于TimerTask是实现Runnable接口的,在TimerTask被放进线程队列睡眠一段时间(wait)之后,当到了指定的该唤起该TimerTask时,由于执行的确切时机取决于JVM的调度策略和当前还有多少线程在等待CPU处理。因此就不能保证任务在所指定的时间内执行。通常在如下两种情况下导致任务延迟执行:

    (1)有大量线程在等待执行

    (2)GC机制的影响导致延迟

    这也是为什么在Timer API中存在两组调度方法的原因。即:

    (1)schedule()

    用固定延迟调度。使用本方法时,在任务执行中的每一个延迟会传播到后续的任务的执行。

    (2)、scheduleAsFixedRate()

    用固定比率调度。使用本方法时,所有后续执行根据初始执行的时间进行调度,从而希望减小延迟。

    具体使用哪一个方法取决于哪些参数对你的程序或系统更重要。

    2、每个Timer对象要在后台启动一个线程。这种性质在一些托管的环境下不推荐使用,比如在应用服务器中。因为这些线程不在容器的控制范围之内了。

    展开全文
  • java实现websocket client

    千次下载 热门讨论 2013-11-08 17:47:12
    java_websocket.jar最新jar包 可用java实现websocket客户端,使用demo: https://github.com/TooTallNate/Java-WebSocket/blob/master/src/main/example/ExampleClient.java
  • Java实现简单的递归操作

    万次阅读 多人点赞 2017-04-03 11:22:48
    在数据结构算法设计中,或者一个方法的具体实现的时候,有一种方法叫做“递归”,这种方法在思想上并不是特别难,但是实现起来还是有一些需要注意的。虽然对于很多递归算法都可以由相应的循环迭代来代替,但是对于...
  • JAVA 实现简单的学生成绩管理系统

    万次阅读 多人点赞 2018-04-15 10:27:23
    2.掌握简单的信息管理系统的设计与实现。二、实验环境实验建议在安装了以下软件的计算机上完成:1.Windows xp/win7/win8/win10操作系统2.JDK 1.6以上版本3.Eclipse或NetBeans IDE或EditPlus或其它开发工具三、实验...
  • Java实现单例的5种方式

    万次阅读 多人点赞 2018-04-01 00:07:35
    Java实现单例的5种方式 1. 什么是单例模式 单例模式指的是在应用整个生命周期内只能存在一个实例。单例模式是一种被广泛使用的设计模式。他有很多好处,能够避免实例对象的重复创建,减少创建实例的系统开销,...
  • 题外话:推荐一个专注于Java开发的网站,做提升学习,价值阅读:Java知音 同时,扫码关注后端技术精选,回复“学习资料”,领取100套小程序源码+小程序开发视频和基本Java经典书籍电子版 在很多的网站都可以实现...
  • java实现HMACSHA256加密签名

    万次阅读 2017-08-03 15:07:41
    java实现HMACSHA256加密签名,需要按照字典排序的朋友可以用SortedMap message=new TreeMap();进行排序后在加密/** * @version 1.0 * @project: autoTrade * @author: QC班长 * @date:2017/8/3 * @time:10:17 */...
  • Java实现二维码生成 Google-Zxing

    万次阅读 多人点赞 2019-01-08 00:12:40
    本篇文章将介绍java中如何生成二维码,二维码的展示主要包括两各方面:1.直接生成图片(直接生成图片不需要web程序,maven工程即可) 2.将二维码转为字节数组,然后在web页面显示。web项目的目录结构以前面的一篇...
  • JAVA实现WEB端实现app扫码登录

    万次阅读 2020-05-19 19:57:46
    接下来就是对于这个服务的详细实现。首先,大概说一下原理:用户打开网站的登录页面的时候,向浏览器的服务器发送获取登录二维码的请求。服务器收到请求后,随机生成一个uuid,将这个id作为key值存入redis服务器,...
  • Java实现图形界面

    万次阅读 多人点赞 2017-12-07 19:04:35
    java实现图形界面,用java实现QQ登录窗口的具体步骤。
  • 快速排序(java实现

    万次阅读 多人点赞 2018-09-05 14:53:42
    高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找...
  • Java实现ModbusTCP通信

    千次阅读 多人点赞 2019-09-05 11:25:49
    Java实现ModbusTCP通信
  • Java实现文件下载

    万次阅读 2017-10-25 12:01:22
    Java实现文件下载
  • Java实现验证码验证功能

    万次阅读 多人点赞 2017-02-22 21:42:03
    Java实现验证码验证功能其实非常简单:用到了一个Graphics类在画板上绘制字母,随机选取一定数量的字母随机生成,然后在画板上随机生成几条干扰线。 首先,写一个验证码生成帮助类,用来绘制随机字母:   ...
  • Java实现Socket长连接和短连接

    千次下载 热门讨论 2014-09-21 11:32:43
    Java实现Socket长连接和短连接,实现原理可参见个人博客
  • java实现长连接

    千次阅读 2018-10-22 15:33:32
    java实现长连接 package socket.keepalive.test; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; ...
  • java实现全局键盘监听

    万次阅读 热门讨论 2018-04-24 12:24:53
    java实现全局键盘监听
  • Java实现远程桌面连接

    万次阅读 热门讨论 2017-09-01 15:36:30
    最近因为项目的原因,需要在系统(基于Java语言的)中调用远程桌面连接登录到其它三方系统,于是需要采用Java实现远程桌面连接。Java嘛,开源代码很多,于是搜集资料,找到了一个不错的开源Java RDP项目,即:...
  • Java实现TPS性能分析

    千次阅读 2019-03-19 12:37:56
    Java实现TPS
  • 几个推荐算法的java实现

    千次下载 热门讨论 2012-01-05 20:00:28
    java实现的几个推荐算法:slopeone SVD,RSVD,ItemNeighborSVD 内有readme,相关内容在blog.csdn.net/lgnlgn
  • java实现图片裁剪

    千次阅读 2017-10-04 08:42:31
    java实现图片裁剪,输入起点x、y,宽度width、高度height测试代码 public static void main(String[] args) { //文件与BufferedImage间的转换 BufferedImage bi=file2img("test.jpg"); //读取图片
  • JAVA实现发送邮箱验证码

    万次阅读 多人点赞 2017-08-26 08:34:57
    JAVA实现发送邮箱验证码
  • Java实现文字转语音

    千次阅读 2019-04-30 09:44:17
    Java实现文字转语音Java实现文字转语音1.环境搭建2.Demo Java实现文字转语音 1.环境搭建 jacob-1.17-M2-x64.dll jacob.jar 需要引入jacob.jar,需要将jacob-1.17-M2-x64.dll文件放入JDK的bin目录下 2.Demo import ...
  • 定时任务Java实现

    千次阅读 2019-02-12 17:38:56
    定时任务Java实现的几种基本方法。 方法一:Thread 是我们最容易想到的,利用while循环,在其中加入sleep方法来实现定时功能。具体代码实现如下 代码示例: public class TestTimeOrder { public static void ...
  • PDF转图片Java实现

    万次阅读 热门讨论 2017-07-31 17:23:39
    PDF转图片Java实现
  • Java实现模糊搜索

    千次阅读 2019-08-18 13:35:24
    Java实现模糊搜索 select * from classification where name like CONCAT(CONCAT('%',#{name}),'%')
  • Java实现超时机制

    千次阅读 2019-09-26 21:18:23
    Java实现超时机制 package util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.*; public class TimeoutUtil { private static final Logger LOGGER = LoggerFactory...

空空如也

1 2 3 4 5 ... 20
收藏数 700,881
精华内容 280,352
关键字:

java实现

java 订阅