2

我想知道一个 jcomponent 是如何在屏幕上绘制的,它是在 Graphics 的 paintComponent() 中绘制的吗?还是单独画的。我问这个是因为它奇怪的是 jbutton 如何在鼠标悬停时改变颜色,即使 repaint() 从未被调用。

谢谢你的时间。

4

3 回答 3

6

Components是用他们的paint方法画的。repaint只是一个有用的方法,它将paint在不久的将来在Event Dispatch Thread上调用。


当鼠标进入 aJButton时,会调用以下方法(对于JButton带有默认 UI 的 s):

public void mouseEntered(MouseEvent e) {
    AbstractButton b = (AbstractButton) e.getSource();
    ButtonModel model = b.getModel();
    if (b.isRolloverEnabled() && !SwingUtilities.isLeftMouseButton(e)) {
        model.setRollover(true);
    }
    if (model.isPressed())
            model.setArmed(true);
}

ButtonModel.setRollover将触发 a ChangeEvent,其处理AbstractButton方式如下:

public void stateChanged(ChangeEvent e) {
    Object source = e.getSource();

    updateMnemonicProperties();
    if (isEnabled() != model.isEnabled()) {
        setEnabled(model.isEnabled());
    }
    fireStateChanged();
    repaint();
}

当鼠标进入 a 时repaint 调用so JButton

于 2012-08-25T02:03:22.240 回答
5

..a jbutton 在鼠标悬停时改变颜色,即使 repaint() 从未被调用。

是的。这段代码就是证明。当然,没有证据表明 Kindle Fire 很可能没有 JRE,但是,Kindle Fire 是一个完全不合适的工具,用于与问答网站进行交流,同时讨论不运行的编程语言的技术点在设备上。

import javax.swing.*;

public class ButtonRepaint {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override 
            public void run() {
                JButton b = new JButton("Hover Over Me!") {
                    @Override
                    public void repaint() {
                        super.repaint();
                        System.out.println("Repaint");
                    }
                };
                JOptionPane.showMessageDialog(null, b);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}
于 2012-08-25T02:03:36.070 回答
3

请注意,paint()被调用的方法属于按钮的 UI 委托,通常派生自BasicButtonUI. 这里有一个使用MetalButtonUI.

于 2012-08-25T02:05:44.783 回答