• B/S结构一机多屏实现,Applet实现。


      上一篇讨论了如何实现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         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下,因为前端无法访问该路径。

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

    常在博园走,也该湿湿鞋。
  • 相关阅读:
    vscode设置js文件自动格式化单引号
    解决git每次输入账号密码问题
    vscode设置vouter标签不换行
    查看修改npm地址并登录
    正则匹配[]外部的内容
    使用v-model实现父子组件之间传值
    发布网站
    安装IIS
    IIS服务添加角色
    react生命周期
  • 原文地址:https://www.cnblogs.com/yhdino/p/2982054.html
Copyright © 2020-2023  润新知