“联系”JSliders以限制合并价值的最佳方式是什么?
想象一下格斗游戏,用户可以指定角色特征,如速度,敏捷性,耐力和准确性。无论用户选择了哪个分配给用户100分,但所有滑块的总值不得超过100.也就是说,滑块不应允许这样的增加。
如果用户分别为速度,敏捷性和耐力分配了30分,那么精度滑块最多应允许10分(因为30 + 30 + 30 + 10 = 100)。尽管如此,每个滑块的范围应保持不变(在本例中为0到100)。
我希望这是有道理的。谢谢你的帮助。
答案 0 :(得分:5)
“nichts einfacher als das” - dachte ...(插入名称: - )
基本上,所有这些增强功能必须在模型中实现:对于JSlider,这是一个BoundedRangeModel。实施/扩展和强制执行其值以尊重“组合”最大值。像
这样的东西public static class LimitedBoundedRangeModel extends DefaultBoundedRangeModel {
BoundedRangeModel limit;
public LimitedBoundedRangeModel(BoundedRangeModel limit) {
this.limit = limit;
}
/**
* @inherited <p>
*/
@Override
public void setRangeProperties(int newValue, int newExtent, int newMin,
int newMax, boolean adjusting) {
if (limit != null) {
int combined = newValue + limit.getValue();
if (combined > newMax) {
newValue = newMax - limit.getValue();
}
}
super.setRangeProperties(newValue, newExtent, newMin, newMax, adjusting);
}
}
// use
LimitedBoundedRangeModel firstModel = new LimitedBoundedRangeModel(null);
LimitedBoundedRangeModel secondModel = new LimitedBoundedRangeModel(firstModel);
firstModel.limit= secondModel;
JSlider first = new JSlider(firstModel);
JSlider second = new JSlider(secondModel);
虽然简单(仅两个家属)和原始(直接双向耦合)并且因此在野外并不真正可用,但它至少应该起作用......但不会 - 从时间上打击我的那些惊喜之一时间;-)视觉问题是拇指位置:
这种不当行为的原因是Handler中的changeListener:它在拖动时不会重新计算其拇指位置(这没关系)。微妙的错误是,内部拖动标志仅在模型的调整属性重置后重置,因此错过了关于最终值的最后一个通知...
如果调整标志从true变为false,那么Hack是调用另一个changeEvent的触发器
boolean invoke =
(adjusting != getValueIsAdjusting()) && !adjusting;
super.setRangeProperties(newValue, newExtent, newMin, newMax, adjusting);
if (invoke) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
fireStateChanged();
}
});
}
答案 1 :(得分:0)
创建4个滑块和一些变量:最大总值(例如100)和当前总数(0)。
当任何滑块的值修改时,请执行以下操作:
// I hope my logic isn't failing me at this point
if (slider.getValue() > (maxTotal - currentTotal))
slider.setValue(maxTotal - currentTotal);
currentTotal = slider1.getValue() + slider2.getValue()
+ slider3.getValue() + slider4.getValue();