我试图了解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);
它什么都不呈现
但删除后
@Override
public void paint(Graphics g){
jButton.paint(g);
}
它呈现空按钮:
问题: 为什么它会这样?为什么委托导致渲染失败?
答案 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。
我希望你明白我要向你解释的内容。