【问题标题】:JFrame in remote between JDK 5 (Server) and 6 (Client - VisualVM)JDK 5(服务器)和 6(客户端 - VisualVM)之间的远程 JFrame
【发布时间】:2012-08-06 14:08:27
【问题描述】:

所以我在打开 JFrame 时有点麻烦。我在网上广泛搜索,但我真的找不到解决方案......

我解释了情况:

我需要开发一个应用程序,该应用程序需要检索信息跟踪应用程序,同时满足新的安全标准。为此,我使用了允许监控的 JMX 和 VisualVM 来查看这些信息。

因此,自 VisualVM 以来,我可以毫无问题地(最近 ^ ^)连接到 JMX。

因此,VisualVM 插件中有一个用于恢复 MBean 上的信息,包括方法上的信息(插件中的操作选项卡)。 这允许停止服务或创建事件。

当我尝试显示统计结果时,我的问题就出现了。 事实上,我必须通过单击“操作”中方法列表中的按钮来显示一个带有 HTML 表格(标题、颜色和其他所有内容)的窗口。

为此,我使用 JFrame:

public JFrame displayHTMLJFrame(String HTML, String title){
        JFrame fen = new JFrame();
        fen.setSize(1000, 800);
        fen.setTitle(title);

        JEditorPane pan = new JEditorPane();
        pan.setEditorKit(new HTMLEditorKit());
        pan.setEditable(false);

        pan.setText(HTML);
        fen.add(pan);
        return fen;
    }

我在我的方法中调用它:

public JFrame displayHtmlSqlStatOK_VM(){
        return displayHTMLJFrame(displaySQLStat(sqlStatOK, firstMessageDate), "SqlStatOK");
    }

因此,该方法必须将我的 JFrame 还给我,但她会产生错误:

Problem invoking displayHtmlSqlStatOK_VM : java.rmi.UnmarshalException: error unmarshalling return; nested 

exception is:
java.io.InvalidClassException: javax.swing.JFrame; local class incompatible: stream classdesc serialVersionUID = 

-5208364155946320552, local class serialVersionUID = -2386951414768123374

我在网上看到这是一个版本问题(序列化),我坚信它来自于我有这个的事实:

服务器 - JDK5 客户端(VisualVM) - JDK6

知道我不能像某些网站和论坛所提倡的那样更改服务器版本(成本太重要了......)。

我的问题如下:

我可以显示这个该死的窗口来保持我当前的架构(JDK5 服务器端和客户端 JDK6)吗?

我可以强迫这个问题吗?告诉他没有什么不好的东西可以运行我的代码?最后我问他,但他没有回答我,也许他会告诉你……(是的,我破解了^^)。

非常感谢那些阅读我并帮助我的人!

如果您需要更多信息,请不要犹豫。

编辑

我的问题的解决方案可能在其他地方,因为实际上我只想要一个格式最少的表格(这只是为了查看一个官员的应用程序让他的小表格他可能将关键数据用红色... )。

但是我在任何地方都找不到可以使用 VisualVM 返回的类型列表……不过,这对我来说似乎并不过分。

后来我想到了一个备份解决方案,那就是创建一个临时的HTML文件并在浏览器中自动打开它,但之后可能不是很干净......但如果它可以工作^^

我对任何研究领域都持开放态度!

【问题讨论】:

    标签: serialization jframe java jmx visualvm


    【解决方案1】:

    看起来您正在通过 JMX 连接发送实例 javax.swing.JFrame - 这是一个坏主意。

    【讨论】:

    • Mmmh ok... 我如何使用 VisualVM 查看 HTML 表格?我试图返回一个字符串,或者一个Arraylist,但是结果真的不行……:/
    • 您需要提供更多信息 - 您要显示什么样的数据?也许您可以将 Tracer 插件与自定义探针一起使用。
    • 我想显示一个 HTML 表格:

      06/08/12 17:24:51 Tableau des requetes excecutees en MOINS de 2000 ms。 Premier message recu le

      ...
      Request ID Req. counter 平均毫秒数 最小值毫秒数 最大值毫秒数 最大值日期
      数据
      TOTAL 0 td> 0
    • 责备我的语法...我不能在“评论”中做得更好
    • 看来您可以使用 CompositeData docs.oracle.com/javase/6/docs/api/javax/management/openmbean/… 从您的应用程序发送数据。
    【解决方案2】:

    很好,我发现自己很厉害:)

    谢谢再见!

    .......

    开个玩笑当然我会给出我找到的解决方案^^

    这就是我所做的:

    我的显示要在客户端完成(正常...)我的代码显示我在服务器上设置的 JFrame 很明显...在服务器上 xD

    我不想更改客户 (VisualVM) 以让用户获得最大的灵活性。但是我意识到,要显示我的 HTML 表格以使其可用(使用颜色和所有内容),我必须更改客户端(因为 JMX 不支持将 JFrame 类型作为回类型操作)。

    我的操作是从 VisualVM 的 MBeans 插件运行的,我有必要找到它的源代码,说“如果你看到我给你的 HTML 你在 JFrame 中显示它,请小心”。

    这是我的方法:

    - 获取来源

    SVN获取VisualVM源码的链接如下:

    https://svn.java.net/svn/visualvm~svn/branches/release134

    如果您像我一样在使用 NetBeans 中包含的 SVN 客户端时遇到问题,因为您在代理后面,您可以通过命令行来解决:

    svn --config-option servers:global:http-proxy-host=MY_PROXY_HOST --config-option servers:global:http-proxy-port=MY_PROXY_PORT checkout https: //svn.java.net/svn/visualvm~svn/branches/release134 sources-visualvm
    

    当然是将您放在目标文件夹中(cd C:\Users\me\Documents\SourcesVisualVM 示例)。

    - 添加平台VisualVM

    NetBeans 需要平台 VisualVM 为其创建模块(插件)。为此,请转到“工具”->“NetBeans 平台”。

    然后点击窗口左下方的“Add Platform ...”,选择文件夹到这个地址下载的bin:http://visualvm.java.net/download.html

    你应该有这个:

    http://img15.hostingpics.net/pics/543268screen1.png

    - 在工作区中添加源 (NetBeansProjects)

    将下载的源代码(来自上述链接的 SVN)复制/粘贴到您的 NetBeans 工作区(默认位于 C:\Users\XXX\Documents\NetBeansProjects 中)。

    - Ouverture du projet du plugin MBeans

    在 NetBeans 中,右键单击项目资源管理器(或转到菜单“文件”)并单击“打开项目...”。 然后,您将在工作区中拥有一个项目列表。 打开“release134”->“Plugins”中的项目“mbeans”,如下:

    http://img15.hostingpics.net/pics/310487screen2.png

    - 更改文件“platform.properties”

    要构建插件,您必须为您的平台定义一些变量。 为此,请打开工作区目录 release134\plugins\nbproject 中的文件 platform.properties。 替换内容(通过更改与您相比的路径):

    cluster.path=\
        C:\\Program Files\\java6\\visualvm_134\\platform:\
        C:\\Program Files\\java6\\visualvm_134\\profiler
    
    # Deprecated since 5.0u1; for compatibility with 5.0:
    disabled.clusters=
    nbjdk.active=default
    nbplatform.active=VisualVM_1.3.4
    suite.dir=${basedir}
    
    harness.dir= C:\\Program Files\\NetBeans 7.1.2\\harness
    

    - 更改类 XMBeanOperations

    要添加我们的功能(显示 HTML 表格),您必须更改处理操作的类,即 com.sun.tools.visualvm 包中的类 XMBeanOperations。 modules.mbeans.

    在第 173 行,替换:

    if (entryIf.getReturnType() != null &&
                                !entryIf.getReturnType().equals(Void.TYPE.getName()) &&
                                !entryIf.getReturnType().equals(Void.class.getName()))
                            fireChangedNotification(OPERATION_INVOCATION_EVENT, button, result);
    

    作者:

    if (entryIf.getReturnType() != null &&
                                !entryIf.getReturnType().equals(Void.TYPE.getName()) &&
                                !entryIf.getReturnType().equals(Void.class.getName())) {
                            if (entryIf.getReturnType() instanceof String) {
                                String res = result + "";
                                if (res.indexOf("<html>") != -1) {
                                    JFrame frame = displayHTMLJFrame(res, button.getText());
                                    frame.setVisible(true);
                                }
                                else
                                    fireChangedNotification(OPERATION_INVOCATION_EVENT, button, result);
                            } else
                                fireChangedNotification(OPERATION_INVOCATION_EVENT, button, result);
                        }
    

    以你放在“void performInvokeRequest(final JButton button)”上面的JFrame的创建方法为例:

    // Display a frame with HTML code
    public JFrame displayHTMLJFrame(String HTML, String title){
            JFrame fen = new JFrame();
        fen.setSize(1000, 800);
        fen.setTitle(title);
    
        JEditorPane pan = new JEditorPane();
        pan.setEditorKit(new HTMLEditorKit());
        pan.setEditable(false);
    
        pan.setText(HTML);
        fen.add(pan);
        return fen;
    }
    

    我们可以看到我们已经对返回类型进行了测试,如果是返回的String,如果是的话,如果我们在这个字符串中看到balise,那么我们通过打开a来替换点击的结果JFrame 与您输入的字符串,是什么让我们显示我们的 HTML 代码!

    - 创建一个 .nbm

    .nbm 文件是插件的部署文件。只需右键单击您的项目(在项目资源管理器中),然后单击“创建 NBM”。 您的文件 .nbm 将在项目根目录的“build”文件夹中创建。

    - 在 VisualVM 中安装插件

    要安装你的插件,你必须进入 VisualVM,进入“工具”->“插件”选项卡,然后“下载”,点击“添加插件...”。选择您的插件 .nbm,然后单击“安装”。然后按照说明进行操作。

    有用的资源

    http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/

    http://visualvm.java.net/"]http://visualvm.java.net/

    http://visualvm.java.net/api-quickstart.html (Créer un plugin VisualVM avec NetBeans)

    非常感谢您的帮助 Tomas Hurka ;)

    【讨论】:

      猜你喜欢
      • 2018-01-06
      • 2023-03-12
      • 2011-02-10
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多