我想知道一个 jcomponent 是如何在屏幕上绘制的,它是在 Graphics 的 paintComponent() 中绘制的吗?还是单独画的。我问这个是因为它奇怪的是 jbutton 如何在鼠标悬停时改变颜色,即使 repaint() 从未被调用。
谢谢你的时间。
我想知道一个 jcomponent 是如何在屏幕上绘制的,它是在 Graphics 的 paintComponent() 中绘制的吗?还是单独画的。我问这个是因为它奇怪的是 jbutton 如何在鼠标悬停时改变颜色,即使 repaint() 从未被调用。
谢谢你的时间。
Component
s是用他们的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
。
..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);
}
}
请注意,paint()
被调用的方法属于按钮的 UI 委托,通常派生自BasicButtonUI
. 这里有一个使用MetalButtonUI
.