我想使用此滑块输出的值来更改加载到img变量中的图像。每当移动滑块时都会调用paint函数。
滑块的值为0 - 2.当滑块为>时,第二个if语句测试为正确。但是,图像不会改变。如果没有if语句,我可以手动切换图像,否则它没有按照我的预期进行操作。
void ModelGUI::sliderValueChanged(Slider* slider)
{
rotate.getValue();
DBG(rotate.getValue());
}
void ModelGUI::paint (Graphics& g)
{
DBG("PAINT");
g.setColour(Colours::red);
if(rotate.getValue() < 1)
{
img = ImageFileFormat::loadFrom(f);
}
if(rotate.getValue() > 1)
{
img = ImageFileFormat::loadFrom(f2);
}
g.drawImage(img, model);
g.drawEllipse(225, 230, 2, 2, 2);
g.drawEllipse(240, 240, 2, 2, 2);
g.drawEllipse(245, 275, 2, 2, 2);
}
为什么会这样?干杯
答案 0 :(得分:1)
只是一个疯狂的猜测,但你不应该以某种方式强迫在sliderValueChanged
事件中重新粉饰吗?我不知道 juce ,但我希望其中之一:
g.Repaint();
g.Refresh();
g.Update();
因为更改滑块可能只是重新绘制滑块本身而不是更新 GUI 的其余部分。 g
应该是您的Graphics
粗略对象。
如果重画非常耗时,那么我通常会这样做:
bool _redraw=false; // some global variable (or local but accessible to your GUI/Form/Canvas whatever)
void any_event()
{
// here event stuff code
if (need_to_repaint) _redraw=true; // for example you change something hit a special key that changes something etc ...
}
void timer() // any timer with target max fps interval
{
if (_redraw())
{
_redraw=false;
// here force repaint or call the repaint directly
}
}
这样重绘不会太慢减慢其他事件的速度。例如,如果我在车轮上使用变焦并且我渲染了很多东西,那么如果在每次更换车轮时重新绘制车轮,车轮会感觉很眩晕。这将仅使用计时器周期重新绘制,如果设置正确,该计时器应该没有问题。
需要这样处理的常见事件是缩放,鼠标移动/编辑和窗口/视图调整大小,因为它们可以每秒创建大量事件调用...
答案 1 :(得分:1)
正如@Spektre所猜测 - 在JUCE中,您的组件需要在知道必要时重新绘制它。在这种情况下:
void ModelGUI::sliderValueChanged(Slider* slider)
{
rotate.getValue();
DBG(rotate.getValue());
repaint();
}
...将导致ModelGUI组件(及其所有子组件)在下一个合理的时间点重新绘制。
请参阅:https://docs.juce.com/master/classComponent.html#af3ab3eabec93dd60faf983370f3a1206