1

私のアプリでは、JavaHelpのjhallファイルを動的にロードしているため、コードはリフレクションを使用しています。奇妙なことに、最初の呼び出しでは正常に機能し、すべてのナビゲーションでJavaHelp画面が正常に表示されます。JavaHelp画面を閉じて再度開くと、次のメッセージが表示されます。

UIDefaults.getUI()が失敗しました:javax.help.JHelpContentViewer [、0,0,0x0、invalid、alignmentX = 0.0、alignmentY = 0.0、border =、flags = 0、maximumSize =、minimumSize =、preferredSize =のcreateUI()が失敗しました] java.lang.reflect.InvocationTargetException java.lang.Error

これは、最初のリクエストを除くすべてのJavaHelpリクエストで発生します。ただし、例外はキャッチされず、createUIエラーをキャッチしようとしましたが、何もキャッチされませんでした(明らかにそれは驚くべきことではありません)。これはクラスローダーの問題である可能性があります-私はクラスローダーで少し不安定です-しかし例外はキャッチされません...私はこのバグのトラブルシューティングに本当に助けが必要です。TIA

FWIW、(ほとんどの)コードは次のとおりです-jHelpClassとhelpSetClassは他の場所で宣言されています...

jHelpClass = null;
helpSetClass = null;
URLClassLoader cl = null;

File jFile = new File(jhallJarFile);
if (!(jFile.exists())) {
    JOptionPane.showMessageDialog(frame,"JavaHelp jar file shown in properties does not exist");
    return;
}
try {
    URI uri = jFile.toURI();
    URL url = uri.toURL();
    URL[] urls = new URL[]{url};

    // Create a new class loader with the directory
    cl = new URLClassLoader(urls, this.getClass().getClassLoader());

    jHelpClass = cl.loadClass("javax.help.JHelp");

    // Find the HelpSet file and create the HelpSet object
    helpSetClass = cl.loadClass("javax.help.HelpSet");
} catch (MalformedURLException e2) {
} catch (ClassNotFoundException e2) {
} catch (NoClassDefFoundError e2) {
}

if (jHelpClass == null || helpSetClass == null) {
    JOptionPane.showMessageDialog(frame,
            "JHelp class or HelpSet class not found in jar file");
    return;
}

// HelpSet hs = null;

URL url = null;
//Object hv = null;
JComponent hv = null;
try {
    url = this.getClass().getClassLoader()
            .getResource("helpSet.hs");
    if (url == null) {
        JOptionPane.showMessageDialog(frame, "HelpSet not found");
        return;
    }


    Constructor conhs = helpSetClass.getConstructor(
            ClassLoader.class, URL.class);
    //Object hs = conhs.newInstance(null, url);
    Object hs = conhs.newInstance(cl, url);
    Constructor conjh = jHelpClass.getConstructor(helpSetClass);
    hv = (JComponent) conjh.newInstance(hs);

} catch (Exception e2) {
    JOptionPane.showMessageDialog(frame,
            "HelpSet could not be processed: " + e2);
    return;
}           

// Create a new frame.
final JFrame frame2 = new JFrame();
frame2.setTitle("Help DrawFBP");
frame2.setIconImage(favicon.getImage());
//frame2.setRequestFocusEnabled(true);
frame2.addKeyListener(new KeyAdapter() {
    public void keyPressed(KeyEvent ev) {
        if (ev.getKeyCode() == KeyEvent.VK_ESCAPE) {
            //frame2.setVisible(false);
            frame2.dispose();
        }
    }
});
// Set its size.
frame2.setPreferredSize(frame.getPreferredSize());
// Add the created helpViewer to it.
frame2.getContentPane().add(hv);code
// Set a default close operation.
frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// Make the frame visible.
frame2.setVisible(true);
frame2.pack();
return;
4

1 に答える 1

0

この問題は、「hv」(JHelp インスタンス) と呼ばれる変数にぶら下がって、毎回再計算しないことで解決できることが判明しました。これが理にかなっているかどうかはわかりませんが、私のアプリは現在動作しています。これを実際に引き起こした原因についてもっと知りたいと思います。また、将来的にトラブルシューティングを行うためのテクニックがあれば知りたいと思いますが、明らかに解決策はもはや緊急ではありません! これに時間を費やしてくれた人に感謝します。

于 2013-02-28T00:02:54.640 に答える