首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >文本鼠标悬停在Swing JTextArea上的弹出窗口?

文本鼠标悬停在Swing JTextArea上的弹出窗口?
EN

Stack Overflow用户
提问于 2011-05-11 06:27:42
回答 3查看 19.3K关注 0票数 21

有没有什么东西可以让你在Swing JTextArea中的单个单词或字母上方显示一个小的文本弹出窗口(比如工具提示)?(或者是具有类似功能的JTextArea替代方案。)

我需要的应该像工具提示一样,换句话说,只有在鼠标悬停在单词上一两秒后才显示弹出文本,一旦鼠标移开,弹出文本就会自动消失。当然,这里的棘手之处在于,我希望它位于文本中的字符/单词级别,而不是组件级别……有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-11 06:54:27

您可以根据需要覆盖getToolTipText(Mouse Event event)

附录:JTextArea的父母JTextComponent通过两种方法提供位置信息:modelToView()viewToModel()latter应该允许您将鼠标位置转换为文档偏移量。

票数 22
EN

Stack Overflow用户

发布于 2011-05-11 06:52:33

也许吧

代码语言:javascript
复制
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);
    }
}
票数 10
EN

Stack Overflow用户

发布于 2011-05-11 06:34:29

这听起来很棘手。这只是我的想法,可能不会被投票。但你也许能做到这一点。

假设您可以实现某种类型的HoverListener或其他东西,否则您将不得不实现一个鼠标侦听器并内置您自己的等待计时器。但是一旦你到了这里,你知道你想要弹出一个工具提示,你就不知道他们在哪个字母/单词上。不过,我很确定可以在屏幕上找到光标的位置。然后使用这个位置,你也许能够计算出光标在TextArea中的位置,然后你就可以抓取字符了。一旦你有了字符/位置,你也可以抓取整个单词,而不需要太多的工作。(请注意,在计算光标悬停的内容时,您希望获得文本区的“视区”,如果文本区有滚动条,则视区将只表示屏幕上可见的区域)

很抱歉我的回答非常冗长,但如果我必须拥有这个功能,而我知道Swing不提供它,那么这是我会尝试的一般逻辑。希望这是一个很好的起点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5957241

复制
相关文章

相似问题

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