java-jcomponents如何绘制?

wmomyfyw  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(331)

我想知道一个jcomponent是如何在屏幕上绘制的,它是在图形的paintcomponent()内部绘制的吗?或者是分开画的。我问这个问题是因为jbutton在mousehover上如何改变颜色很奇怪,即使从未调用repain()。
谢谢你的时间。

kmb7vmvb

kmb7vmvb1#

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

vfh0ocws

vfh0ocws2#

..jbutton在mousehover上更改颜色,即使从未调用repain()。
当然是。这个密码就是证据。当然,在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);
    }
}
toiithl6

toiithl63#

Component 画上他们的 paint 方法。 repaint 只是一个有用的方法 paint 在不久的将来的某个时候,在事件调度线程上。
当鼠标进入 JButton ,调用以下方法(对于 JButton (具有默认ui的用户):

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` 将发射一个 `ChangeEvent` ,由 `AbstractButton` 按以下方式:

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

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

}

所以呢 `repaint` 当鼠标进入 `JButton` .

相关问题