我正在用Java开发一个简单的WYSIWYG RTF编辑器并且有一个小问题.我需要能够将样式选择切换按钮(例如粗体,斜体,下划线)与用户文本选择同步.例如,如果当前的文本选择是平原,没有被选择的粗体,斜体和下划线的切换按钮,但是当用户选择一些文字,是粗体和下划线,粗体和下划线的切换按钮被选择.
现在我很确定能JTextPane.getInputAttributes()获得我想要的选择属性但是在监听插入更新事件时存在问题.问题是附加到的插入符号监听器JTextPane似乎在输入属性发生更改后被调用.所以选择总是落后一步.也就是说,我必须在切换按钮更新之前选择文本两次!
这里重要的代码是:
textPane.addCaretListener(new CaretListener() {
@Override
public void caretUpdate(CaretEvent e) {
syncAttributesWithUI(textPane.getInputAttributes());
}
});
Run Code Online (Sandbox Code Playgroud)
和:
private void syncAttributesWithUI(AttributeSet attributes) {
boldButton.setSelected(StyleConstants.isBold(attributes));
italicButton.setSelected(StyleConstants.isItalic(attributes));
underlineButton.setSelected(StyleConstants.isUnderline(attributes));
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
我有一个编辑器,我想检查所选文本是否包含一些单词.如果它包含那些特定的单词,那么我需要取消选择用户所做的选择.有没有办法做到这一点JTextPane?
我想知道JTextPane内容何时发生变化.我实现了一个键盘监听器,但它只检测键盘事件.如果用户通过鼠标粘贴文本或将文本拖入内部,那么我不会启用检测JTextPane值的更改.哪个事件监听器可以告诉我JTextPane值已更改?
我使用a JTextPane来显示字符和符号,后者由自定义绘制表示JComponents.例如,文本窗格可能显示如下内容:
文本窗格是用户可编辑的,允许用户通过任何位置的按钮添加更多符号,并替换所选文本.我是通过这种JTextPane.insertComponent()方法做到的.在应用程序的某个时刻,我需要知道文本窗格中当前显示的内容,并且我不仅指输入的文本,还指其中包含的确切组件.
我经历了广泛的麻烦Positions和DocumentListeners管理我的文本窗格的内容,但我一直造成比我解决的问题更多的问题.这就是为什么我最终决定,我的麻烦可能是由于我的设计错误,所以我决定看看,如果我无法通过文本窗格访问我的组件.
通过搜索文档和源代码AbstractDocument以及其他相关类,我找到了界面javax.swing.text.Element.然后我让我的应用程序输出
for(int i = 0; i < textPane.getDocument().getLength(); i++) {
System.out.println(((StyledDocument) textPane.getDocument()).getCharacterElement(i));
}
Run Code Online (Sandbox Code Playgroud)
这给了我:
LeafElement(内容)0,4
LeafElement(内容)0,4
LeafElement(内容)0,4
LeafElement(内容)0,4
LeafElement(组件)4,5
LeafElement(内容)5,9
LeafElement(内容)5,9
LeafElement(内容)5,9
LeafElement(内容)5,9
LeafElement(组件)9,10
看到LeafElements我所做的事情似乎有关于在哪个位置显示的内容的某种信息Document,我认为必须能够获得该位置的实际内容.在搜索了另外半个小时后如何获得每个元素代表的内容后,我放弃了并决定在这里发布我的问题,希望你们中的一些人可能知道如何实现这个目标!?
我已经看到这个问题,有人试图访问组件textPane.getComponents(),它返回一个组件数组,其中包含实际包含的组件的确切数量JTextPane,但它们都是类型javax.swing.text.ComponentView$Invalidator,这显然对我没用.也许我只是不知道如何从这里正确地继续,因为对我的符号的原始类型的强制转换不起作用.
TL;博士
如何从文本窗格中获取a JComponent,它位于文本内部JTextPane及其位置?
我试图在JTextPane中进行文本突出显示.我正在使用SwingWorker在后台进行突出显示.但我无法得到理想的输出.
我的代码如下:
主类:
class MultiColor {
private static void displayGUI() {
final JTextPane ta = new JTextPane();
JFrame frame = new JFrame("EXAMPLE");
JButton jb = new JButton("Change");
JScrollPane jsp = new JScrollPane(ta);
frame.add(jsp, BorderLayout.CENTER);
frame.add(jb, BorderLayout.PAGE_END);
frame.pack();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
Modify mm = new Modify(ta);
mm.execute();
}
});
}
public static void main(String[] a) {
Runnable r = new Runnable() {
@Override
public void run() {
displayGUI();
} …Run Code Online (Sandbox Code Playgroud) 我的程序有问题..WordWrap 能够...
确切地说,我想使用 linwrap 但我不想使用 wordwrap...
我搜索了这个
JTextPane textPane = new JTextPane();
JPanel noWrapPanel = new JPanel( new BorderLayout() );
noWrapPanel.add( textPane );
JScrollPane scrollPane = new JScrollPane( noWrapPanel );
Run Code Online (Sandbox Code Playgroud)
当我使用此代码时,换行和自动换行都被禁用......
我想使用换行......
对不起,我糟糕的英语能力......我相信你能明白我的意思,请帮助我......
基于现有的解决方案,我还没有找到一种方法来使 JTextPane(或 JEditorPane)在 JScrollPane 内具有自动换行或强制换行。JTextArea 不是解决方案,因为我需要在特定输入中显示 HTML。
output = new JTextPane();
scrollPane.setViewportView(output);
contentPane.add(scrollPane, gbc_scrollPane);
output.setEditorKit(new WrapEditorKit());
output.setForeground(Color.WHITE);
output.setFont(new Font("Courier New", Font.PLAIN, 12));
output.setEditable(false);
output.setContentType("text/html; charset=UTF-8");
output.setBackground(Color.DARK_GRAY);
Run Code Online (Sandbox Code Playgroud)
WrapEditorKit 是此处可用的。我也尝试过 ScrollablePanel,但每次 JTextPane 的文本都没有被包装。如何在只有垂直滚动(和水平字或强制换行)的 JScrollPane 中实现 JTextPane ?
我正在使用基于 Swing 的 GUI 开发 Java 应用程序。该应用程序用于JTextPane输出日志消息,如下所示:1) 截断现有文本以保持总文本大小低于限制;2) 添加新文本;3)滚动到最后(实际逻辑略有不同,但在这里无关紧要)。
我使用 Eclipse 和 JVM Monitor 来确定合理的文本大小限制并发现显着的内存泄漏。我试图UndoableEditListener从底层文档中删除s 并禁用自动插入符号位置更新(通过使用DefaultCaret.NEVER_UPDATE和显式更改位置JTextPane.setCaretPosition(int)),但没有成功。最后,我决定完全禁用更改插入符号位置,这修复了泄漏。
我有两个问题:
我的代码有问题吗?如果是,我该如何更改它以完成任务?
这是一个 Swing/JVM 错误吗?如果是,我该如何举报?
这是 SSCCE:带有 textPane 和两个按钮的 GUI,用于小型和压力测试。FIX和FIXXX标志对应于我修复内存泄漏的尝试。
package memleak;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.*;
class TestMain
{
private JTextPane textPane;
// try to fix memory leak
private static final boolean FIX = false;
// disable caret updates completely
private static final boolean FIXXX …Run Code Online (Sandbox Code Playgroud) 我正在开发一个 Java 应用程序,除其他外,它应该在文本字段中显示 Magic: The Gathering 卡的详细信息(因为我使用的是 Swing,所以当前是一个JTextPane)。
这些细节包含文本和小图标,其中一些图标与文本内嵌(因此文本围绕它们流动),而根据我的设计,一些图标与同一行中的一些左对齐文本右对齐。
我从另一个应用程序中获取了一张图像,该应用程序的设计与我正在开发的应用程序非常相似(尽管不是使用 Java):
它基本上应该是这样的。
现在,出于对一切的热爱,我无法让它在JTextPane.
我开始尝试使用 CSS 来做到这一点,但发现JEditorPane和 子类不支持“float”属性,所以我尝试使用 PaneStyledDocument来代替。
我一开始没有让第一部分工作(顶部的图标和右对齐文本总是忽略它们的对齐方式,并直接放置在行中左对齐文本之后),直到我发现这个问题。
建议使用以下代码行:
pane.setEditorKit(new HTMLEditorKit());
Run Code Online (Sandbox Code Playgroud)
这确实解决了我的第一个问题。
但现在我陷入了第二部分,使第二部分中的这些图标与文本内联。这是我目前得到的:
我发现,出于某种原因,当您JTextPane使用带有上面代码行的编辑器套件切换到 html 模式时,插入组件会变得完全疯狂。
顶部的图标(实际上我已将其合并为单个图像)和下面文本中的图标(未合并)都位于 的内部JLabels,但如果我将它们添加为图像或添加到 的内部并不重要JLabels。图像或标签绝对不会比你在那里看到的大,我根本不知道额外的空白来自哪里。
我发现了这个问题,答案表明这是某种错误,或者只是 .html 模式的奇怪行为JEditorPane。
如果我再次删除上面的代码行,我最终会遇到原来的问题:
根据图标在文本中的具体位置,我会得到各种不同的奇怪结果。我在下面整理了更多示例图片:
那么,我该如何解决这个问题呢?除了这部分之外,这JTextPane对我来说工作得很好,但我可能会使用其他解决方案,只要最终结果看起来仍然相同。请记住,我可能想在其中添加一些其他组件(如 Button),因此如果可能的话,我想坚持使用 Swing 原生的组件。
用户将无法编辑 TextPane 的内容,但我想稍后添加一个选项,以便一键复制所有内容(所以我宁愿保留文本区域)。
下面,我整理了一个(不是那么简单的)工作示例供您使用:
(编辑:现在更新了底部的代码!旧代码仍然存在于以下链接下。)
我正在使用的图标如下。您需要重命名它们并更改代码中的路径。
需要注意的一些事项:
在 Sharcoux 的回答之后,我编辑了代码,在实际的 JTextPane 上方有 …
我想知道是否有办法在使用 Swing 的 UndoManager 时忽略 JTextPane 中的文本样式更改?
java ×10
jtextpane ×10
swing ×9
word-wrap ×2
caret ×1
element ×1
events ×1
jcomponent ×1
jscrollpane ×1
memory-leaks ×1
undo-redo ×1