首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JTextPane,StyledDocument:从原始输入索引中设置插入符号位置

JTextPane,StyledDocument:从原始输入索引中设置插入符号位置
EN

Stack Overflow用户
提问于 2016-04-20 23:45:58
回答 2查看 370关注 0票数 2

我有一个包含从文件中加载的html内容的JTextPane。一些注释标记是占位符,我想在它们前面插入组件。我正在使用regex匹配器找到这些标记,我可以用matcher.start()获得这些标记的索引。问题是,我不能将插入符号位置放置到html标记的索引中,因为插入符位置需要用户界面插入符。标记被忽略,图像只对一个插入符号进行计数。所以我需要一种方法在指定的索引处插入一个组件。

这是我的密码。

代码语言:javascript
复制
package me.winter.trapgame.client.menu;

import me.winter.trapgame.client.ResourceManager;
import me.winter.trapgame.client.SimpleLayout;
import me.winter.trapgame.server.TrapGameServer;
import me.winter.trapgame.util.ColorTransformer;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * <p>A pane displayed when clicked the button "How to play" in the menu</p>
 *
 * <p>Created by Alexander Winter on 2016-04-20.</p>
 */
public class TutorialPane extends JPanel
{

    private TrapGameMenu menu;

    public TutorialPane(TrapGameMenu menu)
    {
        try
        {
            this.menu = menu;

            JTextPane textPane = new JTextPane()
            {
                @Override
                public void paint(Graphics graphics)
                {
                    Graphics2D g2draw = (Graphics2D)graphics;

                    g2draw.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                    g2draw.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
                    g2draw.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);

                    g2draw.drawImage(menu.getClient().getResourceManager().getImage("background"), -TutorialPane.this.getX() - getX(), -TutorialPane.this.getY() - getY(), menu.getClient().getWidth(), menu.getClient().getHeight(), null);

                    g2draw.setColor(new Color(0, 0, 0, 20));
                    g2draw.fillRoundRect(0, 0, getWidth(), getHeight(), getWidth() / 8, getHeight() / 8);

                    super.paint(graphics);
                }
            };

            setBackground(ColorTransformer.TRANSPARENT);
            textPane.setBackground(ColorTransformer.TRANSPARENT);

            textPane.setContentType("text/html");
            textPane.setEditable(false);

            ResourceManager res = menu.getClient().getResourceManager();

            String page = res.getText("tutorial-page-" + menu.getClient().getLang().getName());
            page = page.replace("<!--style-->", res.getText("tutorial-style"));

            textPane.setText(page);
            Pattern regex = Pattern.compile("<!--([^<>]+)-->");

            Matcher matcher = regex.matcher(page);


            while(matcher.find() && !matcher.hitEnd())
            {
                Image image;

                switch(matcher.group(1).toLowerCase())
                {
                    case "blank_button":
                        image = res.getImage("game-button");
                        break;

                    case "color_button":
                        BufferedImage button = (BufferedImage)res.getImage("game-button");
                        image = new BufferedImage(button.getWidth(), button.getHeight(), BufferedImage.TYPE_INT_ARGB);

                        Graphics2D g2draw = ((BufferedImage)image).createGraphics();

                        g2draw.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                        g2draw.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
                        g2draw.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);

                        g2draw.setColor(new ColorTransformer(TrapGameServer.COLORS[0], 200));
                        g2draw.fillRoundRect(0, 0, button.getWidth(), button.getHeight(), button.getWidth() / 4, button.getHeight() / 4);
                        g2draw.drawImage(button, 0, 0, button.getWidth(), button.getHeight(), null);

                        g2draw.dispose();
                        break;

                    default:
                        image = null;
                }

                textPane.setCaretPosition(matcher.start());
                if(image != null)
                    textPane.insertComponent(new JLabel(new ImageIcon(image)));
            }

            setLayout(new SimpleLayout());
            add(textPane, SimpleLayout.constraints(8, 9, 0.25, 0.75, 7.5, 7.5));
            revalidate();
            repaint();
        }
        catch(Throwable debug)
        {
            debug.printStackTrace(System.out);
        }
    }

    @Override
    public void paint(Graphics graphics)
    {
        Graphics2D g2draw = (Graphics2D) graphics;

        g2draw.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2draw.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2draw.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);

        g2draw.drawImage(menu.getClient().getResourceManager().getImage("background"), -getX(), 0, menu.getClient().getWidth(), menu.getClient().getHeight(), null);

        super.paint(graphics);
    }
}

提前谢谢你的回答。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-22 07:11:14

我认为这不是最好的办法。我会使用带有ID的元素作为位置保持器。然后,我将使用HtmlDocument.getElement获取place holder元素,然后使用Element.getElementStart获取“用户界面”位置。

票数 1
EN

Stack Overflow用户

发布于 2016-04-21 01:35:49

问题是,我不能将插入符号位置放置到html标记的索引中,因为插入符位置需要用户界面插入符。

代码语言:javascript
复制
int offset = textpane.modelToView(modelOffset);
textPane.setCaretPosition( offset );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36757150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档