[英]Extending a class in java but it wont inherit properties from the superclass
好的,所以在我的程序上,無論如何,我都有一些標簽(它們在數組和東西中),無論如何,我想將自己的屬性添加到內置Label
類中,所以我嘗試擴展它
public class LabelMod extends Label
但是每當我嘗試更改它時,它都會創建我的新標簽類型,而不是createContents()
方法中的默認標簽,它似乎並沒有繼承原始標簽屬性,並且出現了很多錯誤
public void createContents()
{
shlTictactoe = new Shell();
shlTictactoe.setSize(450, 300);
shlTictactoe.setText("TicTacToe");
然后有以下9個實例(g1x1,g1x2,g1x3,g2x1等)
LabelMod g1x1 = new LabelMod(shlTictactoe, SWT.NONE);
g1x1.addMouseListener(new MouseAdapter()
{
@Override
public void mouseDown(MouseEvent e)
{
changeSt(0);
}
});
g1x1.setImage(SWTResourceManager.getImage(MainForm.class,
"/res/blank.png"));
g1x1.setBounds(10, 10, 64, 64);
然后將它們放置在數組中
createArray(g1x1, g1x2, g1x3, g2x1, g2x2, g2x3, g3x1, g3x2, g3x3);
我正在使用SWT創建gui,並且在主窗體上有一些標簽。 為什么我不能創建新類型的標簽(帶有添加的其他屬性)?
對於此特定示例,它說“構造函數LabelMod(Shell,int)未定義”
為什么只從超類繼承東西呢? 我嘗試將構造函數添加到labelMod類,但它也給出了未定義的錯誤。 該錯誤已在主類中修復。
public LabelMod(Shell shlTictactoe, int none)
{
super(shlTictactoe,none);
// TODO Auto-generated constructor stub
}
我的另一個想法是將一些Label分配給LabelMods,但是因為它們沒有相同的類型。 她是我的意思的一個例子:
Label g1x1 = new Label(shlTictactoe, SWT.NONE);
g1x1.setImage(SWTResourceManager.getImage(MainForm.class,
"/res/blank.png"));
g1x1.setBounds(10, 10, 64, 64);
然后我有一個數組
public LabelMod[] labelArray = new LabelMod[9];
然后將其分配給標簽
labelArray[0] = g1x1;
顯然因為它們是不同的類型,所以它確實起作用,但是也許可以轉換它或其他東西嗎?
注意:如果我只使用普通Label
而不是我的修改版,那么一切正常,所以我知道那不是問題。
編輯:
這是全班,如果有幫助
public class LabelMod extends Label {
public LabelMod() throws HeadlessException
{
super();
// TODO Auto-generated constructor stub
}
public LabelMod(String text, int alignment) throws HeadlessException
{
super(text, alignment);
// TODO Auto-generated constructor stub
}
public LabelMod(String text) throws HeadlessException
{
super(text);
// TODO Auto-generated constructor stub
}
public LabelMod(Shell shlTictactoe, int none)
{
super(shlTictactoe,none);
// TODO Auto-generated constructor stub
}
public boolean isActivated;
public boolean isActivated()
{
return isActivated;
}
public void setActivated(boolean isActivated)
{
this.isActivated = isActivated;
}
}
我還發現我是否將鼠標懸停在原始(工作) Label(shlTictactoe, SWT.NONE);
格式是
Label(Composite parent, int style)
編輯2:它說的addMouseListener
也有錯誤
Component類型的方法addMouseListener(MouseListener)不適用於參數(new MouseAdapter(){})
對於setImage
我再次變得不確定
未為類型labelMod定義方法setImage(Image)
編輯3一個我認為不重要的細節,但可能對該問題至關重要……這些是我對LabelMod
類的導入-請記住其SWT項目
import java.awt.HeadlessException;
import java.awt.Label;
import org.eclipse.swt.widgets.Shell;
編輯4
好的,所以我添加了適當的導入(這次是swt-確保),所以現在我的導入是:
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
但是現在我遇到了運行時錯誤,如果我進入設計器視圖,所有標簽都無法正確顯示,這就是我在控制台中看到的內容:
org.eclipse.swt.SWTException: Subclassing not allowed
at org.eclipse.swt.SWT.error(SWT.java:4282)
at org.eclipse.swt.SWT.error(SWT.java:4197)
at org.eclipse.swt.SWT.error(SWT.java:4168)
at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
at org.eclipse.swt.widgets.Widget.checkSubclass(Widget.java:313)
at org.eclipse.swt.widgets.Widget.<init>(Widget.java:148)
at org.eclipse.swt.widgets.Control.<init>(Control.java:110)
at org.eclipse.swt.widgets.Label.<init>(Label.java:101)
at Main.LabelMod.<init>(LabelMod.java:16)
at Main.MainForm.createContents(MainForm.java:99)
at Main.MainForm.open(MainForm.java:39)
at Main.MainForm.main(MainForm.java:26)
並在錯誤日志中顯示此信息:
Designer [1.1.0.r37x201109091012.201110120013]: new Label(shell, SWT.NONE)
您在這里遇到了一些問題。
首先,您要混合使用org.eclipse.swt.widgets.Label
和java.awt.Label
。 您(我認為)試圖覆蓋org.eclipse.swt.widgets.Label
,這意味着您需要為此配備合適的構造函數。 這意味着:
public LabelMod(Shell parent, int style)
{
super(parent, style);
}
您不需要任何采用String
參數的構造函數。 這適用於java.awt.Label
,不適用於SWT。
其次,確定要覆蓋Label
嗎? 推薦的SWT工作流程是構建一個包裝或包含Label
的Composite
,並在包裝類中進行自定義工作。 實際上,您需要覆蓋一些內置檢查,甚至甚至不能將SWT小部件繼承為子類。 您必須重寫以下方法:
protected void checkSubclass()
{
/* Allow us to subclass this widget. */
}
第三,我不確定Label
上的createContents
方法是什么。 由於SWT是本機窗口系統的包裝,因此不同的Label
可能在不同的平台上具有不同的私有實現。 例如,在Mac OS上, Label
或其任何祖先上沒有createContents
方法,這表明這是一個無法覆蓋的私有方法。 您需要找到其他方法來覆蓋,以更改您看到的行為。
為此,我會再次詢問-您確定您確實需要覆蓋 Label
而不是僅使用您自己的Composite
為其創建包裝器嗎? 我編寫SWT應用程序已經有好幾年了,我只需要一次擴展一次SWT小部件,而這僅是一次小小的改變,而我創建了包含或包裝其他小部件的無數Composite
。
構造函數不是繼承的,因此您確實需要為子類定義自己的構造函數。 我認為,如果您再試一次,將會發現所顯示的代碼有效(假設您在super
行的末尾添加了缺少的分號。
然后,對於數組,可以將子類的實例分配給超類變量,但不能相反。 這表明Label[]
類型的數組可以正常工作; 它可以容納常規Label
以及labelMod
實例。
我應該指出,Java有一系列非常強大的命名約定。 類始終以首字母大寫命名。 如果您違反了此規定,那么經驗豐富的人就會很難閱讀代碼。
編輯:
java.awt.Label具有3種類型的構造函數
Label()
Label(String)
Label(String, int)
和org.eclipse.swt.widgets.Label具有1種類型的構造函數
Label(Composite, int)
您如何同時撥打電話
public labelMod(Shell shlTictactoe, int none)
{
super(shlTictactoe,none);
// TODO Auto-generated constructor stub
}
public LabelMod(String text, int alignment) throws HeadlessException
{
super(text, alignment);
// TODO Auto-generated constructor stub
}
我認為您正在混合SWT和AWT。 這是真的嗎?
我是個搖擺人,所以我沒有用過swt,但看來您不應覆蓋Label類,並且有檢查阻止您。
還要檢查構造函數,您只能將變量傳遞給超類構造函數可以接受的super。 因此,請檢查javadock。 除非將超類構造為該子類,否則無法將其轉換為子類。
我認為可能發生的是,當您最初創建LabelMod時,導入錯誤,可能是java.awt.Label而不是swt。 我假設您使用的工具Eclipse是根據所選的超類為您創建的所有構造函數(即Label,但不是org.eclipse.swt.widgets.Label)。
因此,要回答該問題,擴展org.eclipse.swt.widgets.Label並添加自己的屬性和方法或覆蓋現有方法應該沒有問題,但是,特別是如果使用的工具為您創建了很多“存根”代碼,您需要確保首先擁有正確的超類。 也許這就是您想要的:
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
public class LabelMod extends Label {
public LabelMod(Composite parent, int style) {
super(parent, style);
// TODO Auto-generated constructor stub
}
public boolean isActivated;
public boolean isActivated() {
return isActivated;
}
public void setActivated(boolean isActivated) {
this.isActivated = isActivated;
}
}
子類確實繼承,但是超類訪問器方法不是固有可訪問的。 能夠從超類獲取/設置值的一種簡單方法是在子類中設置委托方法。
例如,如果超類具有“標簽”屬性,則可以在子類中創建一個方法:
public String getLabel(){
return super.getLabel();
}
public void setLabel(String label){
super.setLabel(label);
}
大多數IDE都有輕松生成委托方法的方法,而無需人工編寫它們。 例如,在Netbeans中,“ alt + insert”將彈出一個代碼生成選項菜單,您可以在其中選擇委托,然后選擇要為其創建委托方法的包含類或超類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.