2017-03-09 7 views
-2

私は独自のGUIライブラリを作成しようとしていますが、私はスーパークラスの難しさを感じています(これは私には新鮮なものです。 )。しかし、私はすべてのコンポーネントを "GGUI"から継承しており、簡単にアクセスできるようにArrayListに格納されています。私の問題は、私はエラーが発生することです: "暗黙のスーパーコンストラクタGrimGUI.GGUI()は未定義です。明示的に別のコンストラクタを呼び出さなければなりません"。リストからスーパークラスにアクセスする

GrimGUI:

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; 
    } 
    } 
} 

ボタン:

class Button extends GGUI { 
    boolean visible, pressed, released, hovering; 
    color cNormal, cPressed, cReleased, cHovering; 
    float x, y, w, h; 

    Button(float X, float Y, float W, float H) { 
    visible = true; 
    x = X; 
    y = Y; 
    w = W; 
    h = H; 
    cNormal = color(75, 75, 75); 
    cPressed = color(100, 100, 100); 
    cReleased = color(125, 125, 125); 
    cHovering = color(175, 175, 175); 
    } 
    Button(boolean visibility, float X, float Y, float W, float H) { 
    visible = visibility; 
    x = X; 
    y = Y; 
    w = W; 
    h = H; 
    cNormal = color(75, 75, 75); 
    cPressed = color(100, 100, 100); 
    cReleased = color(125, 125, 125); 
    cHovering = color(175, 175, 175); 
    } 
    Button(boolean visibility, float X, float Y, float W, float H, color CNORMAL, color CPRESSED) { 
    visible = visibility; 
    x = X; 
    y = Y; 
    w = W; 
    h = H; 
    cNormal = CNORMAL; 
    cPressed = CPRESSED; 
    cReleased = color(125, 125, 125); 
    cHovering = color(175, 175, 175); 
    } 
    Button(boolean visibility, float X, float Y, float W, float H, color CNORMAL, color CPRESSED, color CHOVERING) { 
    visible = visibility; 
    x = X; 
    y = Y; 
    w = W; 
    h = H; 
    cNormal = CNORMAL; 
    cPressed = CPRESSED; 
    cHovering = CHOVERING; 
    cReleased = color(125, 125, 125); 
    } 
    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; 
    } 


    void Update() { 
    CheckState(); 
    if (visible) {//WILL NOT RENDER IF NOT VISIBLE 
     if (pressed && !released) {// IF PRESSED 
     fill(cPressed); 
     } 
     if (released && !pressed) {// IF RELEASED 
     fill(cReleased); 
     } 
     if (hovering && !released && !pressed) {// IF HOVERING 
     fill(cHovering); 
     } 
     if (!hovering && !released && !pressed) {// IF NORMAL/NOT ACTIVE 
     fill(cNormal); 
     } 
     stroke(1); 
     rect(x, y, w, h); 
    } 
    } 

    void CheckState() { 
    hovering = false; 
    released = false; 
    if (mouseX > x && mouseX < x + w) { 
     if (mouseY > y && mouseY < y + h) { 
     hovering = true; 
     } 
    } 
    if (hovering) { 
     if (mPressed) { 
     pressed = true; 
     released = false; 
     } 
     if (mClicked) { 
     released = true; 
     pressed = false; 
     } 
    } else { 
     pressed = false; 
     released = false; 
     hovering = false; 
    } 
    } 

    boolean WasClicked() { 
    return pressed; 
    } 
} 

GGUI:

class GGUI { 
    int x, y; 
    boolean visible; 
    color cBase, cSecondary; 

    GGUI(int _x, int _y, boolean _visible, color _cBase, color _cSecondary) { 
    x = _x; 
    y = _y; 
    visible = _visible; 
    cBase = _cBase; 
    cSecondary = _cSecondary; 
    } 

    void Update() { 
    println("Updated"); 
    } 
} 
+0

これは非常に単純であるようにあなたが大幅にあなたのコードを減らすことができます。スーパークラスにコンストラクタを定義しない限り、Javaはコンパイル時にコンストラクタを作成します。また、自分自身をsuperと呼んでいない場合は、それぞれの拡張クラスからこのコンストラクタへの呼び出しを作成します。 しかし、いくつかの異なるコンストラクタを定義し、スーパークラスにはデフォルトコンストラクタは定義しません。少なくとも1つのスーパーコンストラクタを呼び出す必要がありますが、Javaでは選択できないため、エラーがスローされます。 スーパークラスに空のコンストラクタを実装するか、各ローカルコンストラクタのスーパーコンストラクタの1つを呼び出します。 – DiabolicWords

答えて

1

Implicit super constructor GrimGUI.GGUI() is undefined

だから、それを

0を定義します

must explicitly invoke another constructor

それとも、ボタンがGGUIクラスを期待ようfloat x,yないint x,yを持っていると思われるので意味がありませんsuper()コンストラクタ

Button(<params...>) { 
    super(<params...>) 
    ... // set more things 
} 

しかしを起動する必要があります。

このように考えると、GUIは実際にはピクセルの一部にボタンを配置できますか?


ので

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); 
    } 
+0

ありがとうございます。ソースから、私はこのことを、各コンストラクタ内で "super()"と呼ぶ必要がなくなったことを完全に忘れてしまいました。 ボタンは私の最初のコンポーネントでしたが、私は浮動小数点を使うことができなかったことに気づいていませんでした。浮動小数点をintに変更するのは怠惰でした。 –

+0

そして、コンストラクタからコンストラクタを呼び出すことさえできるのかどうかわかりませんでした。 –

+0

非常に最初の命令として他のコンストラクタを呼び出す必要があります –

関連する問題