2017-03-23 8 views
0

私はJuce GUIライブラリをC++で使用し始めました。私は後でファイル名を表示するカスタムリストボックスを作成しようとしています。今、マウスが入っている/出ている/クリックされたときに、このカスタムリストボックスの行の背景色を変更する必要があります。問題は、MouseEnter()、MouseExit()、およびMouseUp()が機能しないことです。コードは次のとおりです。Juce C++ - マウスイベントが機能しない

class LeftExplorerItem : public Component, public MouseListener { 

public: 

LeftExplorerItem(String name = "LeftExplorerItem") : Component(name), isActive(false) { 

    setSize(100, 20); 

    addMouseListener(this, true); 

} 

void paint(Graphics& g) override { 

    if (!isActive) g.setColour(Colour(40, 40, 40)); 
    else g.setColour(Colour(150, 190, 255)); 
    g.fillRoundedRectangle(2, 2, getWidth() - 4, getHeight() - 4, 4); 



    g.setColour(Colours::white); 
    g.drawText("Frame #", 40, 0, 100, 25, Justification::centredLeft); 



} 

void mouseEnter(const MouseEvent& event) override { 
    AlertWindow("", "", AlertWindow::AlertIconType::InfoIcon); 
    isActive = true; 

} 

void mouseExit(const MouseEvent& event) override { 

    isActive = false; 

} 

void mouseUp(const MouseEvent& event) override { 
    AlertWindow("", "click", AlertWindow::AlertIconType::InfoIcon); 
} 

void resized() override { 

} 

private: 

bool isActive; 

JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(LeftExplorerItem) 
}; 

これは私のカスタムリストボックスの各項目の単なるクラスです。全てが問題なく表示されることを覚えておいてください(唯一の問題は、マウスイベントがトリガーされないということです)。ここには何が欠けていますか?

答えて

1

あなたがここMouseListenerから派生する必要はありません - ComponentクラスMouseListenerクラスと同じシグネチャを持つすべてが、すべてのマウスの更新方法、独自の組み込みのバージョンがあります。

a)MouseListenerから派生を削除し、コンポーネントにマウスリスナーを追加しないでください。物事はうまくいくはずです。

class LeftExplorerItem : public Component /*, public MouseListener*/ { 

public: 

LeftExplorerItem(String name = "LeftExplorerItem") : Component(name), isActive(false) { 

    setSize(100, 20); 

    // addMouseListener(this, true); 

} 

b)は、必要なロジックを追加するMouseListenerから派生しています別のクラスを作成し、addMouseListener方法にその型のオブジェクトへのポインタを渡す(これは)何をしたい、おそらくではありません。

ドキュメントでは、MouseListenerクラスの目的は「コンポーネントのマウスイベントについて通知を受ける必要があるが、そのメソッドをオーバーライドできない、またはしたくない場合は、任意の数のリスナーをこれらのコンポーネントは、呼び出されているコンポーネントの独自のコールバックに加えて、イベントについても通知されます。複数の継承のように私に聞こえる音は、不必要にここにあなたの方法で取得しています。

編集:マウス/終了に入ったときに、あなたのクラスのこのバージョンは、色を変更します。

class LeftExplorerItem : public Component 
{ 
public: 
    LeftExplorerItem(String name = "LeftExplorerItem") : Component(name), isActive(false) { 

     setSize(100, 20); 

     //addMouseListener(this, true); 

    } 

    ~LeftExplorerItem() 
    { 
    } 

    void paint (Graphics& g) override 
    { 
     if (!isActive) g.setColour(Colour(40, 40, 40)); 
     else g.setColour(Colour(150, 190, 255)); 
     g.fillRoundedRectangle(2, 2, getWidth() - 4, getHeight() - 4, 4); 



     g.setColour(Colours::white); 
     g.drawText("Frame #", 40, 0, 100, 25, Justification::centredLeft); 

    } 

    void resized() override 
    { 
     // This method is where you should set the bounds of any child 
     // components that your component contains.. 

    } 

    void mouseEnter(const MouseEvent& event) override { 
     //AlertWindow("", "", AlertWindow::AlertIconType::InfoIcon); 
     isActive = true; 
     repaint(); 

    } 

    void mouseExit(const MouseEvent& event) override { 

     isActive = false; 
     repaint(); 
    } 

    void mouseUp(const MouseEvent& event) override { 
     //AlertWindow("", "click", AlertWindow::AlertIconType::InfoIcon); 
     repaint(); 
    } 


private: 

    bool isActive; 
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LeftExplorerItem) 
}; 
+0

だけで試してみました)、まだイベントトリガーされることはありません飽きません。私はb)を試みます。 – DimChtz

+0

空のプロジェクトにコピーして呼び出されますが、1)AlertWindowオブジェクトを作成していますが、表示されないため、何も表示されません。2)コンポーネントが再描画するように指示しません。視覚的には何も起こりません。 – bgporter

+0

なぜalertwindowが表示されず、再描画するのですか? – DimChtz

関連する問題