标签: jtextpane

JTextPane同步样式选择UI问题

我正在用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)

提前致谢!

java user-interface swing jtextpane

5
推荐指数
1
解决办法
808
查看次数

在JTextPane中取消选择所选文本

我有一个编辑器,我想检查所选文本是否包含一些单词.如果它包含那些特定的单词,那么我需要取消选择用户所做的选择.有没有办法做到这一点JTextPane

java swing jtextpane

5
推荐指数
3
解决办法
3741
查看次数

哪个侦听器可以知道JTextPane值已更改?

我想知道JTextPane内容何时发生变化.我实现了一个键盘监听器,但它只检测键盘事件.如果用户通过鼠标粘贴文本或将文本拖入内部,那么我不会启用检测JTextPane值的更改.哪个事件监听器可以告诉我JTextPane值已更改?

java events swing jtextpane

5
推荐指数
1
解决办法
4740
查看次数

从JTextPane通过javax.swing.text.Element获取组件?

我使用a JTextPane来显示字符和符号,后者由自定义绘制表示JComponents.例如,文本窗格可能显示如下内容: 在此输入图像描述 文本窗格是用户可编辑的,允许用户通过任何位置的按钮添加更多符号,并替换所选文本.我是通过这种JTextPane.insertComponent()方法做到的.在应用程序的某个时刻,我需要知道文本窗格中当前显示的内容,并且我不仅指输入的文本,还指其中包含的确切组件.

我经历了广泛的麻烦PositionsDocumentListeners管理我的文本窗格的内容,但我一直造成比我解决的问题更多的问题.这就是为什么我最终决定,我的麻烦可能是由于我的设计错误,所以我决定看看,如果我无法通过文本窗格访问我的组件.

通过搜索文档和源代码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及其位置?

java swing element jtextpane jcomponent

5
推荐指数
1
解决办法
2198
查看次数

语法 - 使用SwingWorker在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)

java swing jtextpane

5
推荐指数
1
解决办法
1536
查看次数

如何在 Java JTextPane 中禁用 WordWrap?

我的程序有问题..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)

当我使用此代码时,换行和自动换行都被禁用......

我想使用换行......

对不起,我糟糕的英语能力......我相信你能明白我的意思,请帮助我......

java swing jtextpane word-wrap

5
推荐指数
1
解决办法
2826
查看次数

JTextPane + JScrollPane + 自动换行?

基于现有的解决方案,我还没有找到一种方法来使 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 ?

java swing jtextpane jscrollpane word-wrap

5
推荐指数
1
解决办法
1287
查看次数

如何防止 JTextPane.setCaretPosition(int) 中的内存泄漏?

我正在使用基于 Swing 的 GUI 开发 Java 应用程序。该应用程序用于JTextPane输出日志消息,如下所示:1) 截断现有文本以保持总文本大小低于限制;2) 添加新文本;3)滚动到最后(实际逻辑略有不同,但在这里无关紧要)。

我使用 Eclipse 和 JVM Monitor 来确定合理的文本大小限制并发现显着的内存泄漏。我试图UndoableEditListener从底层文档中删除s 并禁用自动插入符号位置更新(通过使用DefaultCaret.NEVER_UPDATE和显式更改位置JTextPane.setCaretPosition(int)),但没有成功。最后,我决定完全禁用更改插入符号位置,这修复了泄漏。

我有两个问题:

  1. 我的代码有问题吗?如果是,我该如何更改它以完成任务?

  2. 这是一个 Swing/JVM 错误吗?如果是,我该如何举报?

细节:

这是 SSCCE:带有 textPane 和两个按钮的 GUI,用于小型和压力测试。FIXFIXXX标志对应于我修复内存泄漏的尝试。

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 swing memory-leaks jtextpane caret

5
推荐指数
1
解决办法
903
查看次数

在 JTextPane 中对齐和内联组件(或图标)

我正在开发一个 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 的内容,但我想稍后添加一个选项,以便一键复制所有内容(所以我宁愿保留文本区域)。

下面,我整理了一个(不是那么简单的)工作示例供您使用:

(编辑:现在更新了底部的代码!旧代码仍然存在于以下链接下。)

http://pastebin.com/RwAdPCzb

我正在使用的图标如下。您需要重命名它们并更改代码中的路径。

在此输入图像描述
在此输入图像描述
在此输入图像描述

需要注意的一些事项:

  • 一开始,我使用“Style”类设置文本样式,如 Oracle 网站上的“如何使用编辑器窗格和文本窗格”教程(TextSamplerDemo.java,供您参考)中所述。这样,我什至无法在顶部完成右对齐部分。奇怪的是,当我使用“SimpleAttributeSet”类进行样式设计时,即使使用完全相同的设置,它也能工作。
  • 我为文本和包含图标的标签尝试了不同的对齐选项。无论我使用什么选项,都没有明显的差异。

更新1:

在 Sharcoux 的回答之后,我编辑了代码,在实际的 JTextPane 上方有 …

java swing jtextpane

5
推荐指数
1
解决办法
2617
查看次数

在 JTextPane 中撤消和重做忽略样式更改

我想知道是否有办法在使用 Swing 的 UndoManager 时忽略 JTextPane 中的文本样式更改?

java jtextpane undo-redo

5
推荐指数
1
解决办法
374
查看次数