这将是一个很长的问题,所以请耐心等待:)
我的应用程序
我正在开发一个 Java(带有 JFrame GUI)桌面应用程序,它执行以下操作:
- 扫描 (.txt) 文件。
- 从这些文件中解析一些数字,对它们执行一些计算,最后将结果存储在字符串变量中。
- 以特殊(表格)格式输出这些数字。(注意:格式包括一些 Unicode(阿拉伯)字符。)
问题
前两部分进行得很顺利。然而,当我来到第三部分(格式化输出)时,我不知道如何显示这种特殊格式,所以,
- 在 Java 中显示特殊格式输出(表格)的最佳方式是什么?
注意:格式化 程序不会有帮助,因为它对表格没有适当的支持。
解决方案一:
我进行了研究,发现我可以使用 JEditorPane,因为它可以显示特殊格式,例如“html”。所以我决定创建一个具有所需(表格)格式的“html”页面,然后在 [JEditorPane][4] 上显示这个页面。我这样做并且进展顺利,直到我想将一些 html 元素的值更改为那些 (.txt) 文件中的解析数字。
- 如何访问 html 元素(例如
<td></td>
)并更改其值?
请注意,(.html)是使用 .html 在 JEditorPane 中加载的setPage(url)
。
Unicode 字符显示正确,但我无法更改某些元素值(例如,我想将值更改<td> 000,000,000 </td>
为<td> MainController.getCurrentTotalPayment() </td>
解决方案二:
我找到了一种解决方法,其中涉及使用 HTMLDocument 和 HTMLEditorKit,这样我可以使用 HTMLEditorKit 从头开始创建 (.html) 并使用kit.insertHTML
.
我已经使用上述方法成功添加了内容,并且我还能够添加来自 (.txt) 文件的解析数字,因为我将它们存储在我的 (MainController) 类中。不幸的是,Unicode 阿拉伯字符没有正确显示。
- 如何正确显示这些 Unicode 字符?
所以第一个解决方案缺乏对 html 元素的访问,而第二个解决方案缺乏 Unicode 支持!
我的同事建议我在可以访问我的 MainController.java 类的 html 文档中使用 JSP 代码。因此,将页面加载到 JEditorPane 中时已经更改了 html 元素。如果没有 JSP 的帮助,难道没有办法做到这一点吗?
其他一些人推荐使用JTidy,但在 Java 的 JDK 中没有办法做到这一点吗?
我对所有可能的解决方案持开放态度。请帮忙。
我的代码:一些代码内容被省略,因为它们不相关
主控制器.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;
}
}
MyFormattedOutputSolutionOne.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){
}
}
}
MyFormattedOutputSolutionTwo.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)替换阿拉伯字符,它可以正常工作,但必须有一种方法可以做到这一点而无需替换每个字符,对吧?