我想知道jcomponent如何在屏幕上绘制,是否在Graphics的paintComponent()中绘制?或者它是单独绘制的。我问这个是因为jbutton在mousehover上改变颜色的方式很奇怪,即使从不调用repaint()也是如此。
感谢您的时间。
答案 0 :(得分:6)
Component
用他们的paint
方法绘制。 repaint
只是一种有用的方法,可以在不久的将来Event Dispatch Thread调用paint
。
当鼠标输入JButton
时,将调用以下方法(对于具有默认UI的JButton
):
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
时,{/ 1}} 被调用。
答案 1 :(得分:5)
.. jbutton会在mousehover上改变颜色,即使从不调用repaint()。
当然可以。这段代码证明了这一点。当然,Kindle Fire上没有证据表明很可能没有JRE,但是Kindle Fire是一个完全不合适的工具,用于与Q& A网站进行通信,同时讨论编程语言的技术要点。没有在设备上运行。
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);
}
}
答案 2 :(得分:3)
请注意,被调用的paint()
方法属于按钮的UI委托,通常来自BasicButtonUI
。有一个使用MetalButtonUI
的示例here。