【问题标题】:How can I insert multiple tooltips at different caret positions in a JTextcomponent?如何在 JTextcomponent 的不同插入符号位置插入多个工具提示?
【发布时间】:2012-04-04 01:49:23
【问题描述】:

我目前正在开发一个项目,该项目需要用户在文本组件中注释(或评论)文本。用户双击文本中的某处,工具提示将出现在该位置(使用他们在另一个对话框中指定的文本)。文本组件应该能够在不同位置管理多个这些工具提示。

例子:“敏捷的棕狐跳过懒狗”

在“quick”一词之前和“lazy”一词之后双击将插入工具提示,如下所示:

“[上面的工具提示]快速的棕色狐狸跳过了懒惰的[上面的工具提示]狗”

我也一直在玩BalloonTip 来实现这一点。

但是,我无法在文本的不同位置插入普通工具提示和气球工具提示。

谁能给我一些关于如何实现这一目标的建议?

【问题讨论】:

  • 实现 getTooltipText(MouseEvent) 以返回特定位置的文本

标签: java swing tooltip caret jtextcomponent


【解决方案1】:

1) 我建议使用JWindow 而不是JToolTip

2) 下面的例子是可能的方法之一

import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.*;
import java.util.*;
import javax.swing.event.*;

public class SimplePaintSurface implements Runnable, ActionListener {

    private static final int WIDTH = 1250;
    private static final int HEIGHT = 800;
    private Random random = new Random();
    private JFrame frame = new JFrame("SimplePaintSurface");
    private JPanel tableaux;

    @Override
    public void run() {
        tableaux = new JPanel(null);
        for (int i = 1500; --i >= 0;) {
            addRandom();
        }
        frame.add(tableaux, BorderLayout.CENTER);
        JButton add = new JButton("Add");
        add.addActionListener(this);
        frame.add(add, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH, HEIGHT);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        tableaux.requestFocusInWindow();
    }

    @Override
    public void actionPerformed(final ActionEvent e) {
        addRandom();
        tableaux.repaint();
    }

    void addRandom() {
        Letter letter = new Letter(Character.toString((char) ('a' + random.nextInt(26))));
        letter.setBounds(random.nextInt(WIDTH), random.nextInt(HEIGHT), 16, 16);
        tableaux.add(letter);
    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new SimplePaintSurface());
    }
}

class Letter extends JLabel {

    private Font font1;
    private Font font2;
    private final FontRenderContext fontRenderContext1;
    private final FontRenderContext fontRenderContext2;

    public Letter(final String letter) {
        super(letter);
        setFocusable(true);
        setBackground(Color.RED);
        font1 = getFont();
        font2 = font1.deriveFont(48f);
        fontRenderContext1 = getFontMetrics(font1).getFontRenderContext();
        fontRenderContext2 = getFontMetrics(font2).getFontRenderContext();
        MouseInputAdapter mouseHandler = new MouseInputAdapter() {

            @Override
            public void mouseEntered(final MouseEvent e) {
                Letter.this.setOpaque(true);
                setFont(font2);
                Rectangle bounds = getBounds();
                Rectangle2D stringBounds = font2.getStringBounds(getText(), fontRenderContext2);
                bounds.width = (int) stringBounds.getWidth();
                bounds.height = (int) stringBounds.getHeight();
                setBounds(bounds);
            }

            @Override
            public void mouseExited(final MouseEvent e) {
                Letter.this.setOpaque(false);
                setFont(font1);
                Rectangle bounds = getBounds();
                Rectangle2D stringBounds = font1.getStringBounds(getText(), fontRenderContext1);
                bounds.width = (int) stringBounds.getWidth();
                bounds.height = (int) stringBounds.getHeight();
                setBounds(bounds);
            }
        };
        addMouseListener(mouseHandler);
    }
}

【讨论】:

  • @mKorbel 您给出的示例使用多个 JLabel 和鼠标操作,我在该上下文中理解。但是,当涉及到在文本组件中以及在字母之间/插入符号位置重新创建它时,我迷路了。
  • @trashgod 我想使用工具提示,并且我理解那里描述的内容 - 但是我如何拥有多个工具提示并让它们在没有鼠标悬停的情况下显示?
  • 鼠标悬停时出现工具提示;单击后,您可以使用CaretListener 跟踪新的插入点。
  • 有两种方法从 Document 中确定单词并从选择中获取 Chars
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多