簡體   English   中英

在Java中擴展類,但它不會從超類繼承屬性

[英]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)

其余部分http://pastebin.com/ru1QCU0A

您在這里遇到了一些問題。

首先,您要混合使用org.eclipse.swt.widgets.Labeljava.awt.Label 您(我認為)試圖覆蓋org.eclipse.swt.widgets.Label ,這意味着您需要為此配備合適的構造函數。 這意味着:

public LabelMod(Shell parent, int style)
{
    super(parent, style);
}

您不需要任何采用String參數的構造函數。 這適用於java.awt.Label ,不適用於SWT。

其次,確定要覆蓋Label嗎? 推薦的SWT工作流程是構建一個包裝或包含LabelComposite ,並在包裝​​類中進行自定義工作。 實際上,您需要覆蓋一些內置檢查,甚至甚至不能將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”將彈出一個代碼生成選項菜單,您可以在其中選擇委托,然后選擇要為其創建委托方法的包含類或超類。

沒有與您的構造函數簽名匹配的構造函數(請參見此處 ),因此當您調用

super(shlTictactoe,none)

它在標簽上找不到合適的構造函數。 您需要傳遞一個String和一個int。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM