设置自定义组件的大小不起作用?

时间:2014-05-13 16:02:09

标签: java

我希望我的两个参数构造函数能够接受两个参数,然后为我设置JComponent的大小。当我这样做时,我收到了错误。为什么会这样呢?我重写该方法并从setSize大小调用setSize方法,但我认为它导致stackoverflow一次又一次地引起递归调用。

如何在我的个人组件中实现setSize(...),以便我可以让某人设置我的组件的大小?

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JComponent;

public class MyComponent extends JComponent {
    private static final long serialVersionUID = 1L;

    MyComponent() {
        super();
    }

    MyComponent(int x, int y) {
        Dimension d = new Dimension(x,y);
        this.setSize(d);
    }

    @Override
    public void setSize(Dimension d) {
        setSize(d);
    }

//  @Override
//  public void setSize(int x, int y) {
//      Dimension d = new Dimension(x,y);
//      setSize(d);
//  }

    @Override
    public Dimension getSize() {
        return this.getSize();
    }

    @Override
    public void setPreferredSize(Dimension d) {
        this.setPreferredSize(d);
    }

    @Override
    public Dimension getPreferredSize () {
         return new Dimension(100, 25);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawLine(10, 10, 100, 100);
    }

    public void paintBorder(Graphics g) {
        super.paintBorder(g);
        g.setColor(Color.YELLOW);
        g.fillRect(0, 0, 50, 50);
        g.setColor(Color.BLACK);
        g.drawRect(0, 0, 50, 50);
    }

    public void paint(Graphics g) {
        super.paint(g);
        paintComponent(g);
        paintBorder(g);
        paintChildren(g);
    }
}
    }

错误:

Exception in thread "main" java.lang.StackOverflowError
    at testpak.MyComponent.setSize(MyComponent.java:23)
    at testpak.MyComponent.setSize(MyComponent.java:23)
    at testpak.MyComponent.setSize(MyComponent.java:23)
    at testpak.MyComponent.setSize(MyComponent.java:23)
    at testpak.MyComponent.setSize(MyComponent.java:23)
    ...etc...

2 个答案:

答案 0 :(得分:0)

 @Override
    public void setSize(Dimension d) {
        super.setSize(d);
    }
你是说这个吗?

答案 1 :(得分:0)

您的直接问题是您的setSize()方法除了调用自身之外什么都不做。它将继续这样做,直到堆栈空间不足。你为什么要覆盖这个方法?如果你打算另外做一些事情,可以删除你的覆盖或在里面使用super.setSize()。

BTW,控制元件尺寸比简单设置尺寸要多。最重要的是包含组件的框架/组件使用的布局管理器可能会根据其规则设置组件的大小。我猜这是你问题的根源......