上一篇讨论了如何实现B/S结构的一机多屏,下面讨论一下具体的实现方法,由于作者是做Java开发的,所以采用Applet来实现一机多屏的效果。
采用Applet获取客户端的屏幕,然后用拼装成自己需要的字符串。举例如下:
1 import java.applet.Applet; 2 import java.awt.AWTException; 3 import java.awt.GraphicsDevice; 4 import java.awt.GraphicsEnvironment; 5 import java.awt.HeadlessException; 6 import java.awt.Robot; 7 import java.util.ArrayList; 8 9 10 public class MultiScreen extends Applet { 11 private static final long serialVersionUID = -8112340460092802461L; 12 13 public MultiScreen() { 14 super(); 15 } 16 17 public static String getScreenInfo(){ 18 String graphicsStr = null; 19 ArrayList<String> list = new ArrayList<String>(); 20 try{ 21 GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 22 GraphicsDevice[] devices = env.getScreenDevices(); 23 int numberOfScreens = devices.length; 24 25 for(int i=0; i<numberOfScreens; i++){ 26 list.add(devices[i].getDisplayMode().getWidth() + "#" + devices[i].getDisplayMode().getHeight()); 27 } 28 29 graphicsStr = "{\"screensSize\":\"" + list.toString() + "\",\"numOfScreens\":" + numberOfScreens + "}"; 30 System.out.println("Number of available screens = " + numberOfScreens); 31 return graphicsStr; 32 33 }catch(HeadlessException e){ 34 e.printStackTrace(); 35 } 36 return graphicsStr; 37 } 38 39 public static void main(String[] args){ 40 System.out.println(MultiScreen.getScreenInfo()); 41 } 42 }
显示的结果如下:
Number of available screens = 2
{"screensSize":"[1366#768, 1680#1050]","numOfScreens":2}
那么利用这种方式就可以在前端使用js的方式对多屏进行控制。
基本方法如下:
用户登录时从库中取出用户的多屏配置信息,具体可能是URL,TITLE等等信息。由于主屏是固定的,所以2、3屏就采用window.open的方式打开。
部分代码:
1 var mScreenObj = { 2 title:"", 3 url:"_blank", 4 height:0, 5 width:0, 6 offsideX:0, 7 offsideY:0 8 } 9 10 function multiScreen(mScreenObj) { 11 this.url = mScreenObj.url; 12 this.title = mScreenObj.title; 13 this.height = mScreenObj.height; 14 this.width = mScreenObj.width; 15 this.offsideX = mScreenObj.offsideX; 16 this.offsideY = mScreenObj.offsideY; 17 } 18 19 multiScreen.prototype.showMS = function () { 20 window.open(this.url, this.title, 'height=' + this.height + ',width=' + this.width + ',top=' + this.offsideY + ',left=' + this.offsideX + ',toolbar=no,menubar=no,scrollbars=no,location=no,status=no'); 21 }
调用的时候只要:
var screen = new multiScreen(mScreenObj);
screen.showMS();
由于具体项目比较复杂,所以以上的例子只是最简单的可能性,真正在使用的时候对于屏幕的左上角是需要计算的,另外还需要考虑如果用户本身是一机多屏的用户但由于屏幕不够,他可能只能开2屏而无法开3屏,或者用户在使用一机多屏,但本身没有多屏权限,那么就只能使用单屏等等,这些细节问题。
另外还需要说明一点,由于该Applet没有经过Java认证,权限是比较有限的,如果想要调用客户端本地的一些方法,例如使用Robot,就需要认证该Applet,相对来说就复杂一些。由于使用javascript的window.open来开2、3屏,所以屏幕就只能向正坐标延伸(ps. window.open的方法不允许开到负坐标)。如果想要开负坐标,可以使用Jframe,但Jframe就要认证该Applet了。
最后关于引用Applet,给一个网上通用的例子作参考:
<!--[if !IE]> Firefox and others will use outer object -->
<object classid="java:包地址"
type="application/x-java-applet"
codebase="webapp存放Applet地址"
height="100" width="100" id="类名" name="类名">
<param name="codebase" value="webapp存放Applet地址">
<!--<![endif]-->
<!-- MSIE (Microsoft Internet Explorer) will use inner object -->
<object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
codebase="webapp存放Applet地址"
height="200" width="200" id="类名" name="类名">
<param name="code" value="包地址" />
<param name="codebase" value="webapp存放Applet地址">
<strong>
当前屏幕没有安装java jre,所以不能支持一机多屏功能。
<br />
<a href="http://java.sun.com/products/plugin/downloads/index.html">
从这里获取并安装java jre.
</a>
</strong>
</object>
<!--[if !IE]> close outer object -->
</object>
<!--<![endif]-->
说明:以上红色字替换成自己的类即可,但不要将编译好的Applet放入web-inf下,因为前端无法访问该路径。
作者水平有限,欢迎大家一起讨论,谢谢。