我希望我的两个参数构造函数能够接受两个参数,然后为我设置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...
答案 0 :(得分:0)
@Override
public void setSize(Dimension d) {
super.setSize(d);
}
你是说这个吗?
答案 1 :(得分:0)
您的直接问题是您的setSize()方法除了调用自身之外什么都不做。它将继续这样做,直到堆栈空间不足。你为什么要覆盖这个方法?如果你打算另外做一些事情,可以删除你的覆盖或在里面使用super.setSize()。
BTW,控制元件尺寸比简单设置尺寸要多。最重要的是包含组件的框架/组件使用的布局管理器可能会根据其规则设置组件的大小。我猜这是你问题的根源......