java - 检测鼠标悬停在 Graphics2D 字符串上

标签 java string swing user-interface awt

当鼠标悬停在 Graphics 2D 字符串上时,有什么方法可以设置其颜色吗?

这是迄今为止我的相关代码:

@Override
public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;

    g2d.setColor(Color.white);

    g2d.setFont(new Font("Arial", Font.BOLD, 16));
    g2d.drawString("EXIT", 650, 50);
}

MouseListener ml=new MouseListener() {

        @Override
        public void mouseClicked(MouseEvent e) {
        }

        @Override
        public void mousePressed(MouseEvent e) {
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        //hover
        //should do something here...        
        }

        @Override
        public void mouseExited(MouseEvent e) {

        }
    };

最佳答案

除了 MouseListener 之外,还可以使用 MouseMotionListener :

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TextHoverComponent extends JPanel {
    private static final long serialVersionUID = 1;

    private static final Color DEFAULT_TEXT_COLOR = Color.WHITE;

    private static final Color HOVER_TEXT_COLOR = Color.RED;

    private Font font = new Font("Arial", Font.BOLD, 16);

    private String text = "EXIT";

    private Color textColor = DEFAULT_TEXT_COLOR;

    private Point textLocation = new Point(650, 50);

    public TextHoverComponent() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent event) {
                checkForHover(event);
            }

            @Override
            public void mouseExited(MouseEvent event) {
                checkForHover(event);
            }
        });

        addMouseMotionListener(new MouseMotionListener() {
            @Override
            public void mouseMoved(MouseEvent event) {
                checkForHover(event);
            }

            @Override
            public void mouseDragged(MouseEvent event) {
                checkForHover(event);
            }
        });
    }

    void checkForHover(MouseEvent event) {
        FontMetrics metrics = getFontMetrics(font);

        Graphics g = getGraphics();
        Rectangle textBounds = metrics.getStringBounds(text, g).getBounds();
        g.dispose();

        textBounds.translate(textLocation.x, textLocation.y);

        if (textBounds.contains(event.getPoint())) {
            textColor = HOVER_TEXT_COLOR;
        } else {
            textColor = DEFAULT_TEXT_COLOR;
        }
        repaint(textBounds);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.setFont(font);
        g.setColor(textColor);
        g.drawString(text, textLocation.x, textLocation.y);
    }
}

关于java - 检测鼠标悬停在 Graphics2D 字符串上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21075552/

相关文章:

java - 读取txt文件并将所有内容显示为粗体

java - 使用 Apache Bcel 库读取注释

python - 提取括号内的(外部)项目数

java - 如何将菜单项保持在文本区域的顶部?

Java 字符串编码

php - 无法在 PHP 中的字符串中添加空格

java - 为什么我在 Java BasicTableUI$Handler.setValueIsAdjusting 中不断收到 NullPointerException?

java - removeChild(): how to remove indent too?

java - 从对象内的对象调用方法?(Java)

java - 如何对大量 JUnit 测试进行分组/分类