我试图了解在Swing中实际上绘制了哪些组件。我阅读了有关在AWT和Swing中绘画的this article,现在尝试编写以下简单程序:

//A simple wrapper to understan how paint() works
public class MyButton extends JButton{
    /**
     * Default serialVersionUID
     */
    private static final long serialVersionUID = 1L;
    private final JButton jButton;

    public MyButton(JButton jButton) {
        this.jButton = jButton;
    }

    @Override
    public void paint(Graphics g){
        jButton.paint(g);
    }
}


但是当我尝试将MyButton添加到框架时

JFrame frame = new JFrame("Hello swing");
JPanel panel = new JPanel();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.add(new MyButton(button));
frame.add(panel);


它什么也没呈现

java - 了解挥杆绘画-LMLPHP

但是删除后

@Override
public void paint(Graphics g){
    jButton.paint(g);
}


它呈现空按钮:

java - 了解挥杆绘画-LMLPHP

问题:为什么这样做?为什么委派导致渲染失败?

最佳答案

首先,当您发布问题时,您应该发布适当的SSCCE来演示问题。我们不能复制/编译随机的代码行。在解决问题之前,您不知道代码的哪一部分导致了问题。


为什么委派导致渲染失败?


我的猜测是按钮的大小为(0,0),所以没有什么可绘制的。

摆脱自定义绘制方法后,即可绘制真实按钮,因为它的大小确实是因为布局管理器已完成其工作。

关于java - 了解挥杆绘画,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36666555/

10-12 00:25