- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
大家早上好我有一个内容类型为“text/html”的 JTextPane。在此 JTextPane 中,我加载了圣经,其中诗句由标签分隔。我想要做的是在用户单击文档的一部分时确定所选的诗集。从现在开始,我可以使用方法 getSelectedText() 获取选定的文本。但是结果不包含原始文档的标签,这可以帮助我检测包含所选文本的诗集的开头或结尾。
我无法进行简单的搜索,因为方法 getSelectedText() 返回没有标签的文本。例如
的结果Abraham eut pour descendant <g v=\"Isaac\">Isaac</g>.
将是“Abraham eut pour descendant Isaac”。所以,如果我进行简单的搜索,我将一无所获。总之,我想知道如何获取所选文本的标签,以便我可以确定所选文本的诗节。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
public class VersetBibliques {
Rectangle[] rects = new Rectangle[2];
HTMLEditorKit kit;
HTMLDocument htmlDoc;
private JPanel getContent() {
rects[0] = new Rectangle();
rects[1] = new Rectangle();
JPanel panel = new JPanel(new GridLayout(1, 0, 10, 0));
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
panel.add(new JScrollPane(getTextPane()));
return panel;
}
private JTextPane getTextPane() {
JTextPane textPane = new JTextPane();
kit = new HTMLEditorKit();
htmlDoc = new HTMLDocument();
textPane.setEditable(false);
textPane.setEditorKit(kit);
textPane.setDocument(htmlDoc);
textPane.setContentType("text/html");
textPane.setBackground(Color.WHITE);
textPane.setFont(new Font("Arial Bold", Font.ITALIC, 38));
try {
kit.insertHTML(htmlDoc, 0, text, 0, 0, null);
} catch (BadLocationException e) {
System.out.println("bad location: " + e.getMessage());
} catch (Exception ex) {
ex.printStackTrace();
}
textPane.addMouseListener(selector);
Style s = htmlDoc.addStyle("logical", null);
StyleConstants.setFontFamily(s, "georgia");
StyleConstants.setFontSize(s, 58);
s = htmlDoc.addStyle("lineSpace", null);
StyleConstants.setLineSpacing(s, 0.25f);
htmlDoc.setLogicalStyle(0, htmlDoc.getStyle("logical"));
return textPane;
}
public static void main(String[] args) {
VersetBibliques test = new VersetBibliques();
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(test.getContent());
f.setSize(600, 400);
f.setLocation(200, 200);
f.setVisible(true);
}
private MouseListener selector = new MouseAdapter() {
public void mousePressed(MouseEvent e) {
try {
JTextPane textPane = (JTextPane) e.getComponent();
int start = textPane.getSelectionStart() - 10;
int end = textPane.getSelectionEnd() + 10;
textPane.setSelectionEnd(end);
textPane.setSelectionStart(start);
String selectedText = textPane.getSelectedText();
System.out.println("text content : " + selectedText);//Il faudra faire le test avec Jean 11:35
System.out.println("start: "+start+"- end:"+end);
} catch (Exception ex) {
ex.printStackTrace();
}
}
};
String text = "<mt>Évangile selon Matthieu</mt>\n"
+ "<c><cn>1</cn>\n"
+ "<mt>Naissance et enfance de Jésus</mt><s>La généalogie de Jésus</s><r>(<ref v=\"LUK3.23-38\">Lc 3.23-38</ref>)</r><v><vn>1</vn>Voici la généalogie de Jésus-Christ, de la descendance de <g v=\"David\">David</g> et d'<g v=\"Abraham\">Abraham</g>. </v>"
+ "<p/><v><q><vn>2 </vn>Abraham eut pour descendant <g v=\"Isaac\">Isaac</g>.<br/>Isaac eut pour descendant <g v=\"Jacob\">Jacob</g>.<br/>Jacob eut pour descendant <g v=\"Juda\">Juda</g> et ses frères.</q></v>"
+ "<v><q><vn>3 </vn>De Thamar, Juda eut pour descendant Péretz et Zérah.<br/>Péretz eut pour descendant Hetsrom.<br/>Hetsrom eut pour descendant Aram.</q></v>"
+ "<v><q><vn>4 </vn>Aram eut pour descendant Aminadab.<br/>Aminadab eut pour descendant Nahchôn,<br/>Nahchôn eut pour descendant Salma.</q></v>"
+ "<v><q><vn>5 </vn>De Rahab, Salma eut pour descendant Booz.<br/>De Ruth, Booz eut pour descendant Obed.</q></v></c>";
}
提前致谢
最佳答案
要从文档中读取html,你需要使用HTMLEditorKit .特别是 write
方法。
要获取选择偏移量,您需要使用 getSelectionStart
和 getSelectionEnd
,或仅使用 getCaretPosition
,来自 JTextPane
要获取这些偏移量周围的标记,您可以使用来自 HTMLDocument 的 getCharacterElement().getStartOffset()
和 getCharacterElement().getEndOffset()
.
最后,这里有一个示例向您展示如何使用它们:
package test;
import java.awt.BorderLayout;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
public class Test {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
String text = "<p><mt>Évangile selon Matthieu</mt>\n"
+ "<c><cn>1</cn>\n"
+ "<mt>Naissance et enfance de Jésus</mt><s>La généalogie de Jésus</s><r>(<ref v=\"LUK3.23-38\">Lc 3.23-38</ref>)</r><v><vn>1</vn>Voici la généalogie de Jésus-Christ, de la descendance de <g v=\"David\">David</g> et d'<g v=\"Abraham\">Abraham</g>. </v>"
+ "<p/><v><q><vn>2 </vn>Abraham eut pour descendant <g v=\"Isaac\">Isaac</g>.<br/>Isaac eut pour descendant <g v=\"Jacob\">Jacob</g>.<br/>Jacob eut pour descendant <g v=\"Juda\">Juda</g> et ses frères.</q></v>"
+ "<v><q><vn>3 </vn>De Thamar, Juda eut pour descendant Péretz et Zérah.<br/>Péretz eut pour descendant Hetsrom.<br/>Hetsrom eut pour descendant Aram.</q></v>"
+ "<v><q><vn>4 </vn>Aram eut pour descendant Aminadab.<br/>Aminadab eut pour descendant Nahchôn,<br/>Nahchôn eut pour descendant Salma.</q></v>"
+ "<v><q><vn>5 </vn>De Rahab, Salma eut pour descendant Booz.<br/>De Ruth, Booz eut pour descendant Obed.</q></v></c></p>";
final JFrame mainFrame = new JFrame("test");
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JTextPane field = new JTextPane();
field.setContentType("text/html");
HTMLEditorKit kit = (HTMLEditorKit) field.getEditorKit();
HTMLDocument doc = (HTMLDocument) field.getDocument();
try (StringReader r = new StringReader(text)) {
kit.read(r, field.getDocument(), 0);
} catch (IOException | BadLocationException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
field.setCaretPosition(10);
field.setSelectionStart(doc.getCharacterElement(field.getCaretPosition()).getParentElement().getStartOffset());
field.setSelectionEnd(doc.getCharacterElement(field.getCaretPosition()).getParentElement().getEndOffset());
try (StringWriter w = new StringWriter()) {
kit.write(w, field.getDocument(), field.getSelectionStart(), field.getSelectionEnd()-field.getSelectionStart());
System.out.println(w.toString());
} catch (IOException | BadLocationException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
mainFrame.getContentPane().setLayout(new BorderLayout());
mainFrame.getContentPane().add(field,BorderLayout.CENTER);
mainFrame.setSize(500,500);
mainFrame.setVisible(true);
}
});
}
}
然后,您还有一些问题需要解决,例如 JTextPane 无法正确表示非 html 标记,因此您必须修复 ViewFactory 以创建您自己的 XMLViewFactory,但这是另一个主题。
关于java - 获取 JTextPane 中选中文本的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38987793/
我正在序列化一个 JTextPane 的 Document,以便将其样式化的文本保存到数据库中。我有一个 caretListener 附加到 JTextPane 我想知道序列化这个 Document
我目前正在尝试制作 Log4j 2登录 JTextPane .它应该像 Netbeans IDE 控制台中的 STDERR 或 STDOUT(包括文本样式 - 颜色)。 我知道我需要创建一个 appe
我在 JScrollPane 中有一个 JTextPane(水平策略从不,垂直策略始终)。我编写了一种在此 JTextPane 中附加文本的方法。现在有一个按钮,单击该按钮时,操作监听器正在运行,执行
我有一个 JTextPane (1),旁边还有另一个 (2)。我已经同步它们,如果在(2)中输入一行,则在(1)中输入一行,但是当我插入图像(24px)时,(2)会自动调整行长度,但(1)当然不会调整
当我使用 JTextPane 并在 HTML 编辑器模式下键入一些文本时 JTextPane textPane = new JTextPane(); textPane.setContentType("
我在 java swing 中有一个应用程序包含 JTextPane 和 HTMLDocument。假设我将 Pane 的文本设置为:
有没有办法读取 JTextPane 的内容逐行?很像 BufferedReader? 最佳答案 Element root = textPane.getDocument().getDefaultRoot
这是我的问题。我正在编写一个具有语法突出显示的编辑器。没什么特别的,但它可以完成工作。问题是我正在实现错误识别,当我想添加样式来下划线时,我覆盖了我以前的样式。这是一个屏幕截图: 我正在做这样的事情来
所以我想写一个简单的编辑器。我想将所有字符之间的所有字符都涂成灰色“字符。它的片段是: class MainPanel extends JPanel { private int WIDTH = 800
我正在开发一个应用程序,当我从列表中选择一个值(文件)时,它应该在不同形式的 jTextPane 中打开。我正在使用两个面板,一个是显示我的列表的主面板,一个是 ExcelSheet,当我单击列表值时
我创建了一个使用 JTextPane 的 Swing 界面。 JTextPane 使用自定义颜色突出显示: textPane.getHighlighter().addHighlight(startPo
有没有办法使 JTextPane 中的文本看起来与控制台输出的文本相似?我的意思是,基本上,每个字符如何具有相同的宽度,以便 ASCII 艺术或间距缩进等内容可以正常工作。 例如,目前,如果我输入“F
我没有得到垂直滚动条。滚动JTextPane。我正在使用 JPanel 显示 JScrollPane 内部的 JTextPane。这是代码。请查看。谢谢。 import java.awt.*; imp
尝试使用此代码,但它不能准确地改变颜色,请注意“停止”一词。当您键入单词时就会发生这种情况。 https://stackoverflow.com/a/28773736/7694892 最佳答案 在我看
我正在尝试用 JScrollPane 包装 JTextPane,并且我需要背景透明。 这是我的代码: public CharPanel(){ super.setLayout(null);
我使用两个语句添加了图像和文本。但在 JTextPane 中,它仅显示文本。我的代码如下 - jTextPane1.insertIcon(new ImageIcon("t.png")); jTextP
我有两个具有静态大小的 JTextPanes,我想像文本处理器中的两个页面一样连接它们。如果我在第一个 JTextPane(页面)中写入一些内容,并且对于一个 JTextPane 来说太长,那么它会溢
我有一个 JTextPane,其模型是 DefaultStyledDocument。我注意到,如果显示文本,然后使用 setCharacterAttributes 将一行上的每个字符更改为更大的字体,
我有来自 Netbeans 设计器部分的 JTextPane。我想在其上添加列和行。但是,JTextPane 的属性窗口中没有添加列或行的选项。还有其他方法可以做到这一点吗? 最佳答案 JTextPa
我有一个文本需要格式化,文本的第一个单词需要加粗、大字体并居中。 为了进行这种格式化,我使用了 TextSamplerDemo.java 中的解决方案在 JTextComponents 的 oracl
我是一名优秀的程序员,十分优秀!