我正在编写的程序有一个问题: 我正在创建 3 个对象类型的JLabel
,并且我使用希伯来语字符串。我将每个字符串与一个开始 HTML 标记和一个结束 HTML 标记连接起来,以启用多行文本。
问题是,当我使用 HTML 标签,将 HTML 标签连接到字符串并将它们设置为 JLabels 文本时,从运行程序到窗口出现大约需要 6 秒。当我不使用HTML标签时,窗口会在运行程序后的一到两秒内显示。
为什么会这样?如何将带有字符串的 HTML 标记用作 JLabel 文本,而不会从启动程序到程序窗口出现这么大的延迟?
操作系统: 视窗 10
编译器: Intellij IDEA
代码:
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
public class GuideUseWin extends JFrame {
private JPanel mainPanel;
private BoxLayout mainLayout;
private JLabel firstImgLbl;
private JLabel secondImgLbl;
private JLabel thierdImgLbl;
public GuideUseWin() {
this.setSize(400, 700);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.mainPanel = new JPanel();
this.mainLayout = new BoxLayout(this.mainPanel, BoxLayout.PAGE_AXIS);
this.mainPanel.setLayout(this.mainLayout);
this.add(this.mainPanel);
this.firstImgLbl = new JLabel();
ArrayList <JLabel> photosLblsArr = new ArrayList<JLabel>();
photosLblsArr.add(this.firstImgLbl);
photosLblsArr.add(this.secondImgLbl);
photosLblsArr.add(this.thierdImgLbl);
String[] stepsArr = {"מדריך שימוש בסיסי בתוכנה ",
"תחילה יש לבחור X מתוך 3 השורות המוצגות בחלון התוכנית, על ידי לחיצה על אחד המקשים 1,2 או 3 במקלדת הנומרית",
"לאחר מכן, יש לבחור מספר על ידי לחיצה על אחד המקשים 0-9 "};
for (int i = 0; i < 3; i++) {
JLabel stepLbl = new JLabel("<html>" + stepsArr[i] + "</html>");
stepLbl.setForeground(Color.black);
stepLbl.setFont(new Font("Serif", Font.BOLD, 20));
stepLbl.setBackground(Color.cyan);
stepLbl.setBounds(100, 100, 100, 100);
stepLbl.setMinimumSize(new Dimension(100, 100));
this.mainPanel.add(stepLbl);
}
this.setVisible(true);
}
}
我检查并发现当我仅使用英语字符串时,窗口在运行程序后 1-3 秒后正确显示。为什么会这样?我怎样才能使用带有字符串的 HTML 标签作为 JLabel 文本,而不会从启动程序到程序窗口出现这么大的延迟?
可以消除一些低效率的地方,比如这样(JLabel,字体创建(:
StringBuilder sb = new StringBuilder("<html>");
for (String step : stepsArr) {
sb.append(step).append("<br>");
}
JLabel stepLbl = new JLabel(sb.toString());
stepLbl.setForeground(Color.black);
stepLbl.setFont(new Font("Serif", Font.BOLD, 20));
stepLbl.setBackground(Color.cyan);
stepLbl.setBounds(100, 100, 100, 300);
stepLbl.setMinimumSize(new Dimension(100, 300));
mainPanel.add(stepLbl);
字体,希伯来语和HTML渲染似乎是主要问题,但我没有实际经验。您可以尝试添加u200E
(从左到右(和u200F
(从右到左(,看看这是否有一些不同。
使用 HTML 字体可能会变得更加棘手。检查是否呈现了相同的字体,而不是其他字体。
StringBuilder sb = new StringBuilder("<html>");
sb.append("<span style='font-family: Serif'>");
for (String step : stepsArr) {
sb.append(step).append("<br>");
}
sb.append("</span>");