-1

Java で htmleditor を開発しました。データベースからのデータをフォーマットするために、そのアプレットを Web サイトにインストールしました。 function callPanelToSetText(String data) jtextpane を正しく設定します。ただし、大量のテキストを渡すと、アプレットがハングし、jtextpane にテキストが表示されません。

  <head>
    <title>Test page for launching the applet via JNLP</title>
</head>
<body>
    <h3>Test page for launching the applet via JNLP</h3>
    <script src="http://java.com/js/deployJava.js"></script>
    <script>
        var attributes = {

             code:       "researchtexteditor.EditorApplet",
            archive:    "ResearchHTMLEditor.jar, lib/jortho.jar",
            width:      600,
            height:     600,
              id:  'EditorValue'

        };
        var parameters = {jnlp_href:"launch.jnlp"}; <!-- Applet Parameters -->
        var version = "1.7"; <!-- Required Java Version -->
        deployJava.runApplet(attributes, parameters, version);
    </script>
    <!-- Or use the following applet element to launch the applet using jnlp_href -->
    <!--
    <applet width="300" height="300">
        <param name="jnlp_href" value="launch.jnlp"/>
    </applet>
    -->
</body>
  <p><a href="javascript:enterNums();">Launch Example</a></p>
<p><a href="javascript:enterNums_get();">Launch Example1</a></p>
</html>
<script language="javascript">
function enterNums(){
  var content='<?php echo $row['rep_contents'];?>';
   alert(content);
//document.write('Value from Jtextpane 11 '+content);
   EditorValue.callPanelToSetText(content);

 }
    function enterNums_get(){
   var TextVal=EditorValue.getTextData();

   document.write('Value from Jtextpane '+TextVal);
  } 

 <!-- ... -->

\

   Function callPanelToSetText(String value) from java is as below

    public static void callPanelToSetText(String value)
    {
           try {

                 SimpleAttributeSet attr=new SimpleAttributeSet();
                  StyleConstants.setFontFamily(attr,"Arial");
                        StyleConstants.setFontSize(attr,13);
                          StyleConstants.setForeground(attr,Color.BLACK);
                         StyleConstants.setBold(attr,false); 
                            StyleConstants.setItalic(attr,false); 
   editorPanel1.htmlDoc.insertString(editorPanel1.htmlDoc.getLength(),value,attr);
           } catch (BadLocationException ex) {
               Logger.getLogger(EditorApplet.class.getName()).log(Level.SEVERE, null, ex);
           }

    }

 The text that i wish to set on jtextpane is 

   String val="CHAPTER 1    INTRODUCTION    13\n" +
      "1.1  Report Description  13\n" +
      "1.2  Reason for doing the study  14\n" +
      "1.3  Key Benefits    14\n" +
      "1.4  Key Market Segments 15\n" +
      "1.5  Key Audiences   15\n" +
      "1.6  Research Methodology    15\n" +
      "1.6.1    Secondary research  16\n" +
      "1.6.2    Primary research    16\n" +
      "1.6.3    Analyst tools and models    18\n" +
      "CHAPTER 2    EXECUTIVE SUMMARY   19\n" +
      "2.1  Market beyond: what to expect by 2025   22\n" +
      "2.1.1    Moderate growth scenario    22\n" +
      "2.1.2    Rapid growth scenario   24\n" +
      "2.1.3    Diminishing growth scenario 26\n" +
      "CHAPTER 3    MARKET OVERVIEW 29\n" +
      "3.1  Market Definition and Scope 29\n" +
      "3.2  Key findings    30\n" +
      "3.2.1    Top Factors Impacting transparent conductive films market   30\n" +
      "3.2.1.1  Rising adoption of touch UI devices 30\n" +
      "3.2.1.2  Declining cost of smartphones   30\n" +
      "3.2.1.3  Low power consumption   30\n" +
      "3.2.1.4  Minimal reflection  30\n" +
      "3.2.1.5  Thinness    31\n" +
      "3.2.1.6  Flexibility/robustness  31\n" +
      "3.2.1.7  Lack of one-size-fits-all solution  31\n" +
      "3.2.1.8  The multiplicity of options is giving rise to market uncertainty and confusion  32\n" +
      "3.2.2    Top Investment Pockets  34\n" +
      "3.2.3    Top winning strategies  34\n" +
      "3.3  Porter’s five force analysis    35\n" +
      "3.3.1    Large number of suppliers leads to lower bargaining power of suppliers  36\n" +
      "3.3.2    Lower switching cost leads to high Buyer power  37\n" +
      "3.3.3    Unavailability of substitute lowers the may raise the threat of complete substitution   37\n" +
      "3.3.4    Economies of scale leads to low threat of new entrants  37\n" +
      "3.3.5    Numerous competitors lead to high rivalry   38\n" +
      "3.4  Value chain analysis    38\n" +
      "";

どこが間違っているのか教えてください。よろしくお願いします。

4

2 に答える 2

0

これらのコード断片のみに基づいて回答を提供することは困難ですが、これを引き起こしているのはデータの量ではないと思われます (ただし、LiveConnect を介して javascript から Java に (およびその逆に) データを渡すには、次の順序で重大な制限があります)。あなたが示したものではなく、メガバイトの)。

次のテスト手順をお勧めします。

1) テスト メソッドを作成してください。同じ署名 (パラメーター) を使用して、testCallPanelToSetText と呼びましょう。

代わりに、このメソッドにテキストを渡すように JavaScript を変更してください。このメソッドの最初の実装では、何もしません。アプレットがハングするかどうかを確認します。ハングしない場合は、その仮定 (問題の原因はデータ量にあるという仮定) を排除できます。

2) 2 番目の実装では、スレッドの問題があるかどうかをテストします。

LiveConnect (JS <-> Java ブリッジ) には、複数のスレッドがどのように相互作用するかについていくつかの仕様があり、swing にはさらに厳しい要件があります。これを読んでください: Swing と複数のスレッド。LiveConnect スレッドから Swing の影響を受ける関数を呼び出さないようにしてください。おそらく、swing スレッドとは異なるでしょう。javascript から呼び出されるすべてのメソッドで、swing 呼び出しをスケジュールして、すぐにではなく、swing スレッドで後で実行されるようにします (記事を読んでください。これは価値があります)。

数バイトで動作するという事実は、ほとんどのマルチスレッド バグの確率的な動作に関係しており、そのことに注意する必要があります。

それを実装した後は機能するはずですが、そうでない場合でも、問題のスレッドが複数ある限り、とにかくこれが必要な設計であることを覚えておく必要があります。

編集: callPanelToSetText の名前を doCallPanelToSetText に変更し、callPanelToSetText をラッパーにします:

public static void callPanelToSetText(final String value) {
  SwingUtilities.invokeLater(new Runnable() {

  @Override
    public void run() {
      doCallPanelToSetText(value);
    }
  });
}

次に、前と同じように JS 呼び出し callPanelToSetText を作成します。問題が解決するかどうかを確認してください。

于 2014-08-02T13:16:51.163 に答える