了解秋千的绘画

时间:2016-04-16 16:13:27

标签: java swing

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

//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);

它什么都不呈现

enter image description here

但删除后

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

它呈现空按钮:

enter image description here

问题: 为什么它会这样?为什么委托导致渲染失败?

3 个答案:

答案 0 :(得分:1)

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

  

为什么委托导致呈现失败?

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

当您摆脱自定义绘制方法时,可以绘制真实按钮,因为它确实具有大小,因为布局管理器已完成其工作。

答案 1 :(得分:0)

public class Demo extends JFrame{
    public static void main(String[] args)
    {
        JPanel panel = new JPanel();
        getContentPane().setLayout(new BorderLayout());
        panel.add(new JButton("Test"));
        this.getContentPane().add(panel, BorderLayout.CENTER);
        this.setSize(200,200);
        this.setVisible(true);
    }
}

如果你想添加UI组件就是这样,不要以任何方式使用paint。 如果您想绘制一个矩形,请遵循本教程:https://docs.oracle.com/javase/tutorial/uiswing/painting/

答案 2 :(得分:0)

您的paint方法不会绘制MyButton对象,而是绘制属于您的类成员的JButton。现在的问题是,这个Button还没有被添加到面板中,因此它什么都没有。通过删除您的绘制方法,调用super.paint(g)因为您的类没有绘制方法,因此您的按钮,但不是绘制成员JButton。

我希望你明白我要向你解释的内容。