java - jcomponents如何绘制?

Ewe*_*wen 2 java swing jcomponent repaint

我想知道如何在屏幕上绘制jcomponent,它是否在Graphics的paintComponent()中绘制?或者它是单独绘制的.我问这个是因为jbutton在mousehover上改变颜色很奇怪,即使从不调用repaint()也是如此.

谢谢你的时间.

Jef*_*rey 6

Components用他们的paint方法绘制.repaint只是一个有用的方法,将paint在不久的将来调用事件调度线程.


当鼠标进入a时JButton,将调用以下方法(对于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);
}
Run Code Online (Sandbox Code Playgroud)

ButtonModel.setRollover将触发一个ChangeEvent,由AbstractButton以下方式处理:

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

    updateMnemonicProperties();
    if (isEnabled() != model.isEnabled()) {
        setEnabled(model.isEnabled());
    }
    fireStateChanged();
    repaint();
}
Run Code Online (Sandbox Code Playgroud)

因此,repaint 当鼠标进入一个叫JButton.


And*_*son 5

..a 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);
    }
}
Run Code Online (Sandbox Code Playgroud)