Control-P5 - 滑块值显示不正确
Control-P5 - Slider values not displaying correctly
我有一个包含滑块的加工草图。生成此滑块的代码如下:
ControlP5 gui;
gui = new ControlP5(this);
gui.addSlider("Tolerance").setPosition(40, height-60).setSize(400, 20).setRange(0.00, 0.10).setValue(0.05).setNumberOfTickMarks(11).setSliderMode(Slider.FLEXIBLE);
gui.getController("Tolerance").getValueLabel().align(ControlP5.RIGHT, ControlP5.TOP_OUTSIDE).setPaddingX(0).setFont(font);
gui.getController("Tolerance").setCaptionLabel("Comparison Tolerance");
gui.getController("Tolerance").getCaptionLabel().align(ControlP5.LEFT, ControlP5.TOP_OUTSIDE).setPaddingX(0).setFont(font);
我遇到的问题是,当滑块位于 0.08
TickMark
和 0.09
TickMark
时,显示值 0.08
。 0.09
是唯一显示不正确的值 - 请参见下图:
当滑块的位置打印到控制台时,滑块实际上选择了上面第三张图中0.09
的正确值,但这种显示错误令人困惑且不理想。任何帮助将不胜感激。
更新: 我后来发现显示在滑块右上角的值总是四舍五入 向下。将滑块值输出到控制台时,这些值通常与预期值略有不同 - 即在中心位置,打印到控制台的实际滑块值是 0.0500003
。通过查看每个滑块位置的真实值,0.09
位置是唯一一个值低于预期值的位置 - 0.0899996
。因此,看起来这是向下舍入到 0.08
以显示该值。所以问题仍然存在 - 有没有办法显示 0.09
的正确值,给定这些信息?
发现得好!也许您应该 post 向开发人员提出问题。
与此同时,你可以做的是subclass Slider class 并使用Java的DecimalFormat class 来修复标签:
import java.text.DecimalFormat;
import controlP5.*;
ControlP5 gui;
void setup(){
size(640,480);
gui = new ControlP5(this);
CustomSlider slider = new CustomSlider(gui,"Tolerance");
slider.setPosition(40, height-60).setSize(400, 20).setRange(0.00, 0.10).setValue(0.05);
slider.setFont(createFont("Verdana",12));
slider.setNumberOfTickMarks(11).setSliderMode(Slider.FLEXIBLE);
slider.getValueLabel().align(ControlP5.RIGHT, ControlP5.TOP_OUTSIDE).setPaddingX(0);
slider.setCaptionLabel("Comparison Tolerance");
slider.getCaptionLabel().align(ControlP5.LEFT, ControlP5.TOP_OUTSIDE).setPaddingX(0);
}
void draw(){
background(0);
}
//subclass slider
public class CustomSlider extends Slider{
//decimal format reference
DecimalFormat df;
//constructor
public CustomSlider( ControlP5 cp5 , String name ) {
super(cp5,name);
//setup decimal format proof of concept - hardcoded fractional digits for now (this can be nicer)
df = new DecimalFormat();
df.setMaximumFractionDigits(2);
}
@Override public Slider setValue( float theValue ) {
super.setValue(theValue);
//this can be improved, follow the CP5 component lifecycle to determine when an instance initialised in the constructor is ready
if(df != null){
_myValueLabel.set( df.format(getValue( )));
}else{
_myValueLabel.set( getValue( ) +"" );
}
return this;
}
}
我有一个包含滑块的加工草图。生成此滑块的代码如下:
ControlP5 gui;
gui = new ControlP5(this);
gui.addSlider("Tolerance").setPosition(40, height-60).setSize(400, 20).setRange(0.00, 0.10).setValue(0.05).setNumberOfTickMarks(11).setSliderMode(Slider.FLEXIBLE);
gui.getController("Tolerance").getValueLabel().align(ControlP5.RIGHT, ControlP5.TOP_OUTSIDE).setPaddingX(0).setFont(font);
gui.getController("Tolerance").setCaptionLabel("Comparison Tolerance");
gui.getController("Tolerance").getCaptionLabel().align(ControlP5.LEFT, ControlP5.TOP_OUTSIDE).setPaddingX(0).setFont(font);
我遇到的问题是,当滑块位于 0.08
TickMark
和 0.09
TickMark
时,显示值 0.08
。 0.09
是唯一显示不正确的值 - 请参见下图:
当滑块的位置打印到控制台时,滑块实际上选择了上面第三张图中0.09
的正确值,但这种显示错误令人困惑且不理想。任何帮助将不胜感激。
更新: 我后来发现显示在滑块右上角的值总是四舍五入 向下。将滑块值输出到控制台时,这些值通常与预期值略有不同 - 即在中心位置,打印到控制台的实际滑块值是 0.0500003
。通过查看每个滑块位置的真实值,0.09
位置是唯一一个值低于预期值的位置 - 0.0899996
。因此,看起来这是向下舍入到 0.08
以显示该值。所以问题仍然存在 - 有没有办法显示 0.09
的正确值,给定这些信息?
发现得好!也许您应该 post 向开发人员提出问题。 与此同时,你可以做的是subclass Slider class 并使用Java的DecimalFormat class 来修复标签:
import java.text.DecimalFormat;
import controlP5.*;
ControlP5 gui;
void setup(){
size(640,480);
gui = new ControlP5(this);
CustomSlider slider = new CustomSlider(gui,"Tolerance");
slider.setPosition(40, height-60).setSize(400, 20).setRange(0.00, 0.10).setValue(0.05);
slider.setFont(createFont("Verdana",12));
slider.setNumberOfTickMarks(11).setSliderMode(Slider.FLEXIBLE);
slider.getValueLabel().align(ControlP5.RIGHT, ControlP5.TOP_OUTSIDE).setPaddingX(0);
slider.setCaptionLabel("Comparison Tolerance");
slider.getCaptionLabel().align(ControlP5.LEFT, ControlP5.TOP_OUTSIDE).setPaddingX(0);
}
void draw(){
background(0);
}
//subclass slider
public class CustomSlider extends Slider{
//decimal format reference
DecimalFormat df;
//constructor
public CustomSlider( ControlP5 cp5 , String name ) {
super(cp5,name);
//setup decimal format proof of concept - hardcoded fractional digits for now (this can be nicer)
df = new DecimalFormat();
df.setMaximumFractionDigits(2);
}
@Override public Slider setValue( float theValue ) {
super.setValue(theValue);
//this can be improved, follow the CP5 component lifecycle to determine when an instance initialised in the constructor is ready
if(df != null){
_myValueLabel.set( df.format(getValue( )));
}else{
_myValueLabel.set( getValue( ) +"" );
}
return this;
}
}