[英]Class constructor calling another
我想有2個構造函數,其中一個調用另一個。
例如:
public class MyButton extends JButton {
private final ImageIcon neutralIcon;
private final ImageIcon pressedIcon;
private final ImageIcon rollOverIcon;
public MyButton(String n,
String p,
String r,
Dimension d)
{
neutralIcon = new ImageIcon(this.getClass().getResource(n));
pressedIcon = new ImageIcon(this.getClass().getResource(p));
rollOverIcon = new ImageIcon(this.getClass().getResource(r));
this.setIcon(neutralIcon);
this.setPressedIcon(pressedIcon);
this.setRolloverIcon(rollOverIcon);
this.setFocusPainted(false);
this.setContentAreaFilled(false);
this.setSize(d);
}
public MyButton(String n,
String p,
String r)
{
this(n,p,r,this.getPreferredSize()); // COMPILE ERROR
}
}
我需要獲得preferredSize,但是NetBeans說了類似“在調用超類型構造函數之前無法引用此內容”之類的內容。
我嘗試了“超級”操作,但仍然給我錯誤。
我的朋友告訴我將getPreferredSize放入變量中,但是沒有用。
Dimension d = this.getPreferredSize();
this(n,p,r,d); // COMPILE ERROR
將方法調用更改為常量,因此:
public MyButton(String n,
String p,
String r)
{
this(n,p,r,PREFERRED_SIZE);
}
可以使用Builder
模式來解決此問題:
import java.awt.Dimension;
import javax.swing.JButton;
public class MyButton extends JButton {
private String n;
private String p;
private String r;
private Dimension d;
private MyButton(){
super();
}
static class MyButtonBuilder{
private String n;
private String p;
private String r;
private Dimension d;
public MyButtonBuilder(String n, String p, String r){
this.n = n;
this.p = p;
this.r = r;
}
public void setDimension(Dimension d){
this.d = d;
}
public MyButton build(){
MyButton myButton = new MyButton();
myButton.n = this.n;
myButton.p = this.p;
myButton.r = this.r;
myButton.d = (myButton.d == null) ? myButton.getPreferredSize():this.d;
return myButton;
}
}
public static void main(String[] args) {
MyButtonBuilder builder = new MyButton.MyButtonBuilder("1", "2","3");
MyButton myButton = builder.build();
}
}
嘗試這個
public MyClass(String n,
String p,
String r)
{
this(n,p,r,new Dimension(WIDTH, HEIGHT)); // COMPILE ERROR
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.