4

それは長い質問になるので、我慢してください:)

私のアプリケーション

次のことを行う Java (JFrame GUI を使用) デスクトップ アプリケーションを開発しています。

  1. (.txt) ファイルをスキャンします。
  2. これらのファイルからいくつかの数値を解析し、いくつかの計算を実行して、最終的に結果を String 変数に格納します。
  3. これらの数値を特別な (テーブル) 形式で出力します。(注: 形式には一部の Unicode (アラビア語) 文字が含まれています。)

問題

最初の 2 つの部分はスムーズに進みました。しかし、第 3 部 (フォーマットされた出力) に来たとき、この特殊なフォーマットを表示する方法がわからなかったので、

  • Java で特別な形式の出力 (テーブル) を表示する最良の方法は何ですか?

注:テーブルを適切にサポートしていないため、フォーマッターは役に立ちません。

解決策 1:

調査の結果、「html」などの特殊な形式を表示できる JEditorPane を使用できることがわかりました。そこで、必要な (テーブル) フォーマットで「html」ページを作成し、このページを [JEditorPane][4] に表示することにしました。私はそれを行い、いくつかのhtml要素の値をそれらの(.txt)ファイルから解析された数値に変更したくなるまでスムーズに進みました。

  • html 要素 (例: <td></td>) にアクセスしてその値を変更するにはどうすればよいですか?

(.html) は、 を使用して JEditorPane 内にロードされることに注意してくださいsetPage(url)

Unicode 文字は正しく表示されますが、一部の要素の値を変更できませんでした (たとえば、 の値を に変更し<td> 000,000,000 </td>たい<td> MainController.getCurrentTotalPayment() </td>

解決策 2:

HTMLDocument と HTMLEditorKit を使用する方法で、HTMLEditorKit を使用して (.html) を最初から作成し、.html を使用して JEditorPane に表示できますkit.insertHTML

上記の方法を使用してコンテンツを正常に追加しました。また、(MainController) クラスに格納されているため、(.txt) ファイルから解析された数値を追加することもできました。残念ながら、Unicode のアラビア文字は正しく表示されませんでした。

  • これらの Unicode 文字を正しく表示するにはどうすればよいですか?

したがって、最初のソリューションには html 要素へのアクセスがなく、2 番目のソリューションには Unicode サポートがありません!

私の同僚は、私の MainController.java クラスにアクセスできる HTML ドキュメントで JSP コードを使用するようにアドバイスしてくれました。したがって、html 要素が既に変更された状態でページを JEditorPane にロードします。JSP の助けを借りずにそれを行う方法はありませんか?

JTidyの使用を推奨する人もいますが、Java の JDK 内でそれを行う方法はありませんか?

私はすべての可能な解決策を受け入れます。助けてください。

My Code:一部のコード コンテンツは関連性がないため省略されました

MainController.java

class MainController 
{
    private static String currentTotalPayment;

    public static void main(String[] args) 
    {
        CheckBankFilesView cbfView = new CheckBankFilesView();
        cbfView.setVisible(true);
    }

    public static void setCurrentTotalPayment(String totalPayment) {
        MainController.currentTotalPayment = totalPayment;
    }

    public static String getCurrentTotalPayment() {
        return currentTotalPayment;
    }
}

MyFormattedOuputSolutionOne.java:

public class MyFormattedOuputSolutionOne extends javax.swing.JFrame {

    private void MyFormattedOuputSolutionOne() {

        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        myFormattedOuput = new javax.swing.JEditorPane();

        myFormattedOuput.setContentType("text/html");
        //myFormattedOuput.setContentType("text/html; charset=UTF-8"); //Doesn't seem to work

        myFormattedOuput.setEditable(false);

        jScrollPane1.setViewportView(myFormattedOuput);

        myFormattedOuput.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

        try{
            myFormattedOuput.setPage(getClass().getResource("resources/emailFormat2.html"));

            //How can I edit/change html elements loaded in 'myFormattedOuput'?
        }catch(Exception e){
        }
    }
}

MyFormattedOuputSolutionTwo.java:

public class MyFormattedOuputSolutionTwo extends javax.swing.JFrame {

    private void MyFormattedOuputSolutionTwo() {

        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        myFormattedOuput = new javax.swing.JEditorPane();

        myFormattedOuput.setContentType("text/html");
        //myFormattedOuput.setContentType("text/html; charset=UTF-8"); //Doesn't seem to work

        myFormattedOuput.setEditable(false);

        jScrollPane1.setViewportView(myFormattedOuput);

        HTMLEditorKit kit = new HTMLEditorKit();

        HTMLDocument doc = new HTMLDocument();

        myFormattedOuput.setEditorKit(kit);

        myFormattedOuput.setDocument(doc);

        myFormattedOuput.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

        try{
            // Tried to set the charset in <head> but it doesn't work!
            //kit.insertHTML(doc, 1, "<meta http-equiv = \"Content-Type\" content = \"text/html; charset=UTF-8\">", 0, 0, HTML.Tag.META);

            kit.insertHTML(doc, doc.getLength(), "<label> السلام عليكم ورحمة الله وبركاته ,,, </label>", 0, 0, null); //Encoding problem
            kit.insertHTML(doc, doc.getLength(), "<br/>", 0, 0, null); // works fine
            kit.insertHTML(doc, doc.getLength(), MainController.getCurrentTotalPayment(), 0, 0, null); // works fine

            //How can I solve the Unicode problem above?
        }catch(Exception e){
        }
    }
}

htmlFormatTable.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">

<html>

    <head>

        <meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8">

    </head>

    <body>

        <label> السلام عليكم ورحمة الله وبركاته ,,, </label>
        <br/>
        <label>  الأخوة الكرام نفيدكم بتفاصيل المدفوعات لشهر  </label> XX/143X </label>  هـ كما هو موضح ادناه  </label>
        <br/>
        <table align="right"  border="1" width="600" cellpadding="5" cellspacing="0">
            <tr char="utf-8" bgcolor="cccccc" align="center">
                <td colspan="3">   <label> تفاصيل مدفوعات بنك الرياض </label>  <img src="..\images\riyadh.gif" width="65" height="15"/> </td>
            </tr>
            <tr align="center">
                <td></td>
                <td id="cell1">0,000,000.00</td>
                <td align="right"> معاشات </td>
            </tr>
            <tr align="center">
                <td></td>
                <td id="cell2">0,000,000.00</td>
                <td align="right"> أخطار </td>
            </tr>
            <tr align="center">
                <td bgcolor="cccccc"> المجموع </td>
                <td bgcolor="cccccc">   0,000,000.00 <label> ريال سعودي </label> </td>
                <td></td>
            </tr>
        </table>
        <br/>
        <label> شاكرين لكم حسن تعاونكم ...... </label>
        <br/>
        <label> فريق العمليات بقسم الحاسب الآلي </label>

    </body>

</html>

私の長い複数の質問スレッドを読んでくれてありがとう。あなたの答えが待ちきれません。

アップデート:

この洞察を提供してくれた @Howard に感謝します。アラビア文字を対応する Unicode (例: ب = \u0628) に置き換えると問題なく動作しますが、各文字を置き換える必要なくそれを行う方法が必要ですよね?

4

1 に答える 1

3

ソリューション 1

JEdi​​torPane にロードされた HTML を編集することができます。MyFormattedOuputSolutionOne.java に基づく完全なコードは次のとおりです。

import java.awt.ComponentOrientation;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.SimpleAttributeSet;

public class MyFormattedOuputSolutionOne extends javax.swing.JFrame {

    private MyFormattedOuputSolutionOne() {
        super("MyFormattedOuputSolutionOne");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
        final JEditorPane myFormattedOuput = new javax.swing.JEditorPane();

        getContentPane().add(jScrollPane1);

        myFormattedOuput.setContentType("text/html");
        //myFormattedOuput.setContentType("text/html; charset=UTF-8"); //Doesn't seem to work

        myFormattedOuput.setEditable(false);

        jScrollPane1.setViewportView(myFormattedOuput);

        myFormattedOuput.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

        try{
            myFormattedOuput.setPage(getClass().getResource("htmlFormatTable.html"));
            myFormattedOuput.addPropertyChangeListener(new PropertyChangeListener() {

                @Override
                public void propertyChange(PropertyChangeEvent evt) {
                    if ("page".equals(evt.getPropertyName())) {
                        Document doc = myFormattedOuput.getDocument();
                        Element html = doc.getRootElements()[0];
                        Element body = html.getElement(1);
                        Element table = body.getElement(1);
                        try {
                            Element tr2 = table.getElement(1);
                            Element tr2td1 = tr2.getElement(0);
                            doc.insertString(tr2td1.getStartOffset(), "1: 123,456",
                                             SimpleAttributeSet.EMPTY);

                            Element tr3 = table.getElement(2);
                            Element tr3td1 = tr3.getElement(0);
                            doc.insertString(tr3td1.getStartOffset(), "2: 765.123",
                                             SimpleAttributeSet.EMPTY);
                        } catch (BadLocationException e) {
                            e.printStackTrace();
                        }
                        myFormattedOuput.removePropertyChangeListener(this);
                    }
                }

            });

            //How can I edit/change html elements loaded in 'myFormattedOuput'?

        } catch(Exception e){
            e.printStackTrace();
        }

        pack();
        setSize(700, 400);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MyFormattedOuputSolutionOne();
            }
        });
    }
}

ドキュメントを非同期にロードし、ページがロードされるのを待ちます。ページが読み込まれると、ドキュメントの要素にアクセスして要素を検索し<td>、テーブルの 2 行目と 3 行目の最初の行にテキストを挿入します。

ところで、あなたの HTML は有効ではありません! あなたはそれをきれいにするべきです。これを行うと、ドキュメント要素のインデックスが変更され、挿入ポイントを見つけるコードを調整する必要があります。

ウィンドウは次のようになります。 ソリューション 1 つのウィンドウのスクリーン ショット

解決策 2

エンコーディングに問題はありませんでした。文字は正しく表示されます。それでも、Eclipse プロジェクトで Java ファイルのエンコーディングを UTF-8 に設定する必要がありました。

アラビア語が正しく表示されている解決策 2

ソリューション 3

JTableUI に結果の表を表示するために使用することを検討しましたか?


HTML は次のようになります。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">

<html>
    <head>
        <meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8">
    </head>
    <body>
        <p> السلام عليكم ورحمة الله وبركاته ,,, </p>

        <p>  الأخوة الكرام نفيدكم بتفاصيل المدفوعات لشهر  </p>
        <p>XX/143X </p>
        <p>  هـ كما هو موضح ادناه  </p>

        <table align="right"  border="1" width="600" cellpadding="5" cellspacing="0">
            <tr bgcolor="cccccc" align="center">
                <td colspan="3">تفاصيل مدفوعات بنك الرياض <img src="..\images\riyadh.gif" width="65" height="15"/></td>
            </tr>
            <tr align="center">
                <td></td>
                <td id="cell1">0,000,000.00</td>
                <td align="right">معاشات</td>
            </tr>
            <tr align="center">
                <td></td>
                <td id="cell2">0,000,000.00</td>
                <td align="right">أخطار</td>
            </tr>
            <tr align="center">
                <td bgcolor="cccccc">المجموع</td>
                <td bgcolor="cccccc">0,000,000.00 ريال سعودي</td>
                <td></td>
            </tr>
        </table>
        <p> شاكرين لكم حسن تعاونكم ...... </p>
        <p> فريق العمليات بقسم الحاسب الآلي </p>
    </body>
</html>

私は言葉を理解していないので、より良いフォーマットを提案することはできません. まず、<label>要素は でのみ使用でき<form>ます。<label>テーブルの上に 3 つの s のシーケンスがあり、そのうちの 1 つだけに開始<label>タグがあり、3 つの終了</label>タグがありました。私はそれらをすべて<p>;にしました。ただし、それらをテーブル列のヘッダーにするつもりなら、3 つの<th>要素を持つテーブル行を使用する必要があります。

HTML のこの構造では<table>、HTML ツリーの要素はインデックス 4 になります。つまり、行を変更する必要があります。

Element table = body.getElement(1);

Element table = body.getElement(4);

インデックス 0 ~ 3 が<p>要素になりました。


補足として、 HTML を にロードした後に HTML を編集JEditorPaneして のテキスト モデルにロードする代わりにHTMLDocument、 に渡す前に HTML ドキュメントを編集して、要素setPageに正しいデータが含まれるようにすることができます。メソッドは のみを受け入れる<td>ため、を受け入れ、モデルを記述するものを選択します (この場合は のインスタンスである必要があります)。はこのタスクの最良の候補ですが、UTF-8 文字を正しく読み取ることができないため廃止されました。これを念頭に置いて、関数(J2SE 6 以降)を使用し、HTML でエンコーディングを宣言し、読み取り時にそれを尊重します。JEditorPane.setPageURLreadInputStreamObjectHTMLDocumentStringBufferInputStreamString.getBytes("UTF-8")ByteArrayInputStreamJEditorPane

于 2011-08-11T21:07:40.893 に答える