java - jcomponents如何绘制?

时间:2012-08-25 01:49:39

标签: java swing repaint jcomponent

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

感谢您的时间。

3 个答案:

答案 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