Juce C++ - события мыши не работают

Я только начал использовать библиотеку Juce GUI для C++. Я пытаюсь создать собственный список, где я буду отображать имена файлов позже. Теперь мне нужно изменить цвет фона строк этого настраиваемого списка, когда мышь нажата / нажата. Проблема в том, что 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)
};

Это просто класс для каждого элемента моего пользовательского списка. Имейте в виду, что все выглядит нормально (список, все элементы списка и т. Д.), Единственная проблема заключается в том, что события мыши никогда не запускаются. Чего здесь не хватает?

1 ответ

Решение

Вам не нужно выводить из MouseListener здесь - Component класс имеет свою собственную встроенную версию всех методов обновления мыши, все из которых имеют ту же сигнатуру, что и в MouseListener учебный класс. Или

а) удалить деривацию из MouseListener и не добавляйте слушателя мыши к компоненту. Вещи должны просто работать.

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

public:

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

    setSize(100, 20);

    // addMouseListener(this, true);

}

б) Создайте отдельный класс, который получен из 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)
};
Другие вопросы по тегам