gpt4 book ai didi

java - 在java中扩展一个类,但它不会从父类(super class)继承属性

转载 作者:行者123 更新时间:2023-12-01 06:20:42 36 4
gpt4 key购买 nike

好吧,在我的程序中,我有一些标签(位于数组和其他内容中),无论如何,我想将自己的属性添加到内置的 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) 未定义”

为什么它不继承父类(super class)的东西?我尝试将构造函数添加到 labelMod 类中,但它也给出了未定义的错误。然而,该错误在主类中得到修复。

public LabelMod(Shell shlTictactoe, int none)   
{
super(shlTictactoe,none);
// TODO Auto-generated constructor stub
}

我的另一个想法是只将一些标签分配给 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 而不是我的修改版本,一切都会正常,所以我知道这不是问题。

编辑:

如果有帮助,这里是完整的类(class)

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 也有错误,它说

The method addMouseListener(MouseListener) in the type Component is not applicable for the arguments (new MouseAdapter(){})

对于setImage我再次未定义

The method setImage(Image) is undefined for the type labelMod

编辑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;

但现在我收到运行时错误,如果我进入设计器 View ,所有标签都无法正确显示,这是我在控制台中得到的内容:

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吗? recommended SWT workflow是构建一个包装或包含 LabelComposite 并在包装类中执行自定义工作。实际上,您需要重写一些内置检查才能子类化 SWT 小部件。您必须重写以下方法:

protected void checkSubclass()
{
/* Allow us to subclass this widget. */
}

第三,我不确定 Label 上的 createContents 方法是什么。由于 SWT 是 native 窗口系统的包装器,因此不同的 Label 在不同的平台上可能有不同的私有(private)实现。例如,在 Mac OS 上,Label 或其任何祖先上没有 createContents 方法,这表明这是您无法重写的私有(private)方法。您需要找到一种不同的方法来重写,以更改您所看到的行为。

为此,我会再次询问 - 您确定您确实需要覆盖 Label 而不是简单地使用您自己的围绕它创建一个包装器>复合?我编写 SWT 应用程序已经有好几年了,我需要扩展 SWT 小部件一次,而且只是为了一个微不足道的更改,而我已经创建了无数Composite 包含或包装其他小部件。

关于java - 在java中扩展一个类,但它不会从父类(super class)继承属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7740276/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com