Java 从列表中访问超类的原始类
我正在尝试创建自己的GUI库,但我在使用Super类时遇到了一些困难(这对我来说是一种新的功能,无法找到一个好的源代码来学习)。但我的所有组件都是从“GGUI”扩展而来的,然后存储在ArrayList中以便于访问。我的问题是我得到了一个错误:“隐式超级构造函数GrimGUI.GGUI()未定义。必须显式调用另一个构造函数” 格里姆吉:Java 从列表中访问超类的原始类,java,class,processing,Java,Class,Processing,我正在尝试创建自己的GUI库,但我在使用Super类时遇到了一些困难(这对我来说是一种新的功能,无法找到一个好的源代码来学习)。但我的所有组件都是从“GGUI”扩展而来的,然后存储在ArrayList中以便于访问。我的问题是我得到了一个错误:“隐式超级构造函数GrimGUI.GGUI()未定义。必须显式调用另一个构造函数” 格里姆吉: Button testScreen; Slider firstSlider; Slider secondSlider; Text firstSliderText;
Button testScreen;
Slider firstSlider;
Slider secondSlider;
Text firstSliderText;
Text secondSliderText;
boolean onHome;
boolean onTest;
ArrayList<GGUI> gguiScreen = new ArrayList<GGUI>();
void setup() {
size(500, 500);
onHome = true;
background(255);
gguiScreen.add(new Button(75, 50, 40, 20));
testScreen = new Button(115, 50, 40, 20);
testScreen.cNormal = color(0, 255, 125);
firstSlider = new Slider(250, 250, 100);
secondSlider = new Slider(250, 280, 100);
firstSliderText = new Text(280, 250, "0");
secondSliderText = new Text(280, 280, "0");
}
void draw() {
background(255);
HomeScreen();
TestScreen();
endFix();
}
void HomeScreen() {
if (onHome) {
testScreen.Update();
firstSlider.Update();
firstSliderText.content = str(firstSlider.value);
firstSliderText.Update();
if (testScreen.released) {
onTest = true;
onHome = false;
}
}
}
void TestScreen() {
if (onTest) {
Button trash = (Button)gguiScreen.get(0);//Testing that I can get the only object placed in it to view on screen
trash.Update();
secondSlider.Update();
secondSliderText.content = str(secondSlider.value);
secondSliderText.Update();
if (trash.WasClicked()) {
onTest = false;
onHome = true;
}
}
}
隐式超级构造函数GrimGUI.GGUI()未定义
那么定义它吧
class GGUI {
GGUI() {
// Set some default values
}
必须显式调用另一个构造函数
Button(<params...>) {
super(<params...>)
... // set more things
}
或者您需要调用super()
构造函数
Button(<params...>) {
super(<params...>)
... // set more things
}
这很简单。只要不在超类中定义任何构造函数,Java就会在编译时创建一个。如果您自己不调用super,它还会从每个扩展类创建对该构造函数的调用。但是您定义了几个不同的构造函数,并且在超类中没有默认的构造函数。当您被迫调用至少一个超级构造函数,但Java无法为您选择时,就会抛出错误。要么在超类中实现一个空构造函数,要么从每个本地构造函数中调用一个超构造函数。谢谢。我从中了解到这一点的源代码完全没有在开始时调用每个构造函数中的“super()”(“不确定,但只发现它起作用了”)。Buttons是我的第一个组件,我只是没有意识到float不能被使用,而且我懒得像其他组件一样将float更改为int。我不知道你甚至可以从构造函数调用构造函数你必须调用其他构造函数作为第一条指令,是的
Button(<params...>) {
super(<params...>)
... // set more things
}
Button(boolean visibility, float X, float Y, float W, float H, color CNORMAL, color CPRESSED, color CHOVERING, color CRELEASED) {
visible = visibility;
x = X;
y = Y;
w = W;
h = H;
cNormal = CNORMAL;
cPressed = CPRESSED;
cHovering = CHOVERING;
cReleased = CRELEASED;
}
// For example...
Button(boolean visibility, float X, float Y, float W, float H, color CNORMAL, color CPRESSED, color CHOVERING) {
// Call the other constructor
this(visibility, X, Y, W, H, CNORMAL, CPRESSED, CHOVERING, color(125, 125, 125));
cReleased = color(125, 125, 125);
}