上一篇讨论了如何实现B/S结构的一机多屏,下面讨论一下具体的实现方法,由于作者是做Java开发的,所以采用Applet来实现一机多屏的效果。

  采用Applet获取客户端的屏幕,然后用拼装成自己需要的字符串。举例如下:

View Code
 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的方式打开。

  部分代码:

View Code
 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下,因为前端无法访问该路径。

  作者水平有限,欢迎大家一起讨论,谢谢。

 

 

 

 

posted on 2013-03-26 10:42  yhdino  阅读(1927)  评论(1编辑  收藏  举报