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