【问题标题】:Detect mouse hover on Graphics2D string检测鼠标悬停在 Graphics2D 字符串上
【发布时间】:2014-01-31 06:28:43
【问题描述】:

当鼠标悬停在图形 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) {

        }
    };

【问题讨论】:

  • 不使用Color.white,而是将颜色存储在一个字段中并在mouseEnteredmouseExited中更新该字段。
  • @VGR 如何知道 g2d 字符串是否处于悬停状态?
  • 啊,我明白了……您的组件不仅仅是文本。我撤销我之前的评论。除了使用 MouseListener,还要使用 MouseMotionListener。

标签: java string swing user-interface awt


【解决方案1】:

除了 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    相关资源
    最近更新 更多