我正在用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)
提前致谢!
我一直在创建类似文本编辑器的东西,并注意到NetBeans中一个有趣的功能:从模板创建Java应用程序(例如,"桌面应用程序")时,它会创建不可变的代码块(它们可供查看但是它们不能直接修改).
此镜头应使上述所有文字清晰:

那么,问题是:如何使用JTextPane实现这样的功能?
我有一个编辑器,我想检查所选文本是否包含一些单词.如果它包含那些特定的单词,那么我需要取消选择用户所做的选择.有没有办法做到这一点JTextPane?
我想知道JTextPane内容何时发生变化.我实现了一个键盘监听器,但它只检测键盘事件.如果用户通过鼠标粘贴文本或将文本拖入内部,那么我不会启用检测JTextPane值的更改.哪个事件监听器可以告诉我JTextPane值已更改?
我需要显示链接,所以我正在使用带有setContentType的JTextPane.但是,内容不会换行,也没有滚动.JTextPane的内容将从RSS源返回.这是完整的代码:
import java.awt.*;
import javax.swing.*;
class Main extends JFrame
{
JFrame frame;
JTabbedPane tabbedPane;
JPanel home, news;
public Main()
{
setTitle("My Title" );
setSize( 900, 600 );
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
home();
news();
tabbedPane = new JTabbedPane();
tabbedPane.addTab( " Home", home );
tabbedPane.addTab( "News", news );
JPanel framePanel = new JPanel();
framePanel.setLayout(new BorderLayout());
framePanel.add( tabbedPane, BorderLayout.CENTER );
getContentPane().add( framePanel );
}
public void home()
{
home = new JPanel();
// some stuffs here
}
public void news()
{
news = new JPanel(); …Run Code Online (Sandbox Code Playgroud) 只是试图为JTextPane中的文本着色 - 但问题是文本和下划线不能有不同的颜色.我该怎么办?或者甚至可能吗?下面的示例打印所有文本并以红色下划线.
JTextPane pane = new JTextPane();
StyleContext context = new StyleContext();
Style style = pane.addStyle("Black", null);
StyleConstants.setAlignment(style, StyleConstants.ALIGN_RIGHT);
StyleConstants.setFontSize(style, 14);
StyleConstants.setSpaceAbove(style, 4);
StyleConstants.setSpaceBelow(style, 4);
StyleConstants.setForeground(style, Color.BLACK);
StyledDocument document = pane.getStyledDocument();
style = pane.addStyle("Red Underline", style);
StyleConstants.setForeground(style, Color.RED);
StyleConstants.setUnderline(style, true);
pane.getDocument().insertString(0, "Test String", style);
Run Code Online (Sandbox Code Playgroud) 我正在尝试Log4j 2登录JTextPane.它应该像Netbeans IDE控制台中的STDERR或STDOUT(包括文本样式 - 颜色).
我知道我需要创建一个appender并连接它JTextPane,但我不知道它是如何使用的Log4j 2.
你有什么建议吗?
我感谢你的帮助,marty
我使用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) 我正在尝试JOptionPane使用超链接调整长句的对话框()的高度.
我的代码是......
public class DialogTest {
public static void main(String[] args) throws Exception {
JTextPane jtp = new JTextPane();
Document doc = jtp.getDocument();
for (int i = 0; i < 50; i++) {
doc.insertString(doc.getLength(), " Hello Java World ", new SimpleAttributeSet());
if ((3 == i) || (7 == i) || (15 == i)) {
doc.insertString(doc.getLength(), " Hello Java World ", new SimpleAttributeSet());
SimpleAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setUnderline(attrs, true);
StyleConstants.setForeground(attrs, Color.BLUE);
String text = "www.google.com";
URL url = …Run Code Online (Sandbox Code Playgroud) jtextpane ×10
java ×9
swing ×9
appender ×1
element ×1
events ×1
highlighting ×1
jcomponent ×1
joptionpane ×1
log4j2 ×1
netbeans ×1
resize ×1