0

我刚开始使用 C++ 的 Juce GUI 库。我正在尝试创建自定义列表框,稍后我将在其中显示文件名。现在,当鼠标进入/退出/单击时,我需要更改此自定义列表框行的背景颜色。问题是 MouseEnter()、MouseExit() 和 MouseUp() 不起作用。这是代码:

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

这只是我的自定义列表框每个项目的类。请记住,一切看起来都很好(列表框、所有列表框项目等),唯一的问题是鼠标事件永远不会被触发。这里缺少什么?

4

1 回答 1

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)
};
于 2017-03-23T20:02:01.440 回答