- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想创建一个 JSpinner,它可以在 指定的最小值 和 指定的最大值 之间获取所有可能的 Double
值。
此外,JSpinner 应该能够显示文本而不是特定值。假设我们的 JSpinner 可以取 -1 到 10 之间的值。我想显示一个文本,例如“自动”,而不是 -1。
如何替换经过
这是我写的模型,但似乎还不够,因为它说在 JSpinner 中有一个错误,因为文本不是 Double
。
public class SpinnerSpecialModel
extends AbstractSpinnerModel implements SpinnerMinMaxModel {
public static final double DEFAULT_MINIMUM = 0.0;
public static final double DEFAULT_MAXIMUM = Double.POSITIVE_INFINITY;
public static final double DEFAULT_STEP = 1.0;
public static final double DEFAULT_VALUE = 1.0;
public static final double DEFAULT_SPECIAL_NUMBER = -1.0;
public static final String DEFAULT_SPECIAL_TEXT = "Auto";
private double maximum;
private double minimum;
private double stepSize;
private double currentNumber;
private double specialNumber;
private String specialText;
private Object m_Value;
public SpinnerSpecialModel(double max, double min, double step, double num,
double specialNum, String specialTxt) {
maximum = max;
minimum = min;
stepSize = step;
currentNumber = num;
specialNumber = specialNum;
specialText = specialTxt;
setAccurateValue(num);
}
public SpinnerSpecialModel(double specialNum, String specialTxt) {
this(DEFAULT_MAXIMUM, DEFAULT_MINIMUM,
DEFAULT_STEP, DEFAULT_VALUE, specialNum, specialTxt);
}
public SpinnerSpecialModel() {
this(DEFAULT_SPECIAL_NUMBER, DEFAULT_SPECIAL_TEXT);
}
@Override
public Object getValue() {
if (currentNumber == specialNumber) {
m_Value = specialText;
}
else {
m_Value = currentNumber;
}
return m_Value;
}
@Override
public void setValue(Object value) {
setAccurateValue(value);
}
private void setAccurateValue(Object value) {
if (value instanceof Double) {
double doubleValue = (Double) value;
if (doubleValue != currentNumber) {
if (doubleValue == specialNumber) {
currentNumber = specialNumber;
m_Value = specialText;
}
else if (doubleValue > maximum) {
currentNumber = maximum;
m_Value = maximum;
}
else if (doubleValue < minimum) {
currentNumber = maximum;
m_Value = minimum;
}
else {
currentNumber = doubleValue;
m_Value = doubleValue;
}
fireStateChanged();
}
}
if (value instanceof String) {
String stringValue = (String) value;
if (stringValue.equals(specialText)) {
this.currentNumber = specialNumber;
this.m_Value = specialText;
fireStateChanged();
}
}
}
@Override
public Object getNextValue() {
return getNewValue(+1);
}
@Override
public Object getPreviousValue() {
return getNewValue(-1);
}
/**
*
* @param direction
* @return
*/
private Object getNewValue(int direction) {
double newValue = currentNumber + direction * stepSize;
setAccurateValue(newValue);
return m_Value;
}
@Override
public double getMaximum() {
return maximum;
}
@Override
public double getMinimum() {
return minimum;
}
@Override
public double getStepSize() {
return stepSize;
}
@Override
public void setMaximum(double max) {
maximum = max;
}
@Override
public void setMinimum(double min) {
minimum = min;
}
@Override
public void setStepSize(double step) {
stepSize = step;
}
}
最佳答案
做到这一点的最好和正确的方法不是写一个模型那么简单,但也不是很复杂。您实际上需要编写一个 Editor
和一个 Formatter
才能拥有真正的 MVC 微调器:
JSpinner
的类:SpecialValuesSpinner
。SpecialValuesSpinnerModel
DefaultEditor
并实现 DocumentListener
的类:SpecialValuesSpinnerEditor
NumberFormatter
的类:SpecialValuesSpinnerFormatter
我不会向您展示所有类的代码,但基本上您必须在每个类中执行以下操作:
特殊值微调器:
public class SpecialValuesSpinner() extends SpinnerNumberModel {
// in your constructor do this
setModel(new SpecialValuesSpinnerModel(YOUR_SPECIAL_VALUES);
setEditor(new SpecialValuesSpinnerEditor());
}
特殊值微调器模型:
public class SpinnerSpecialValuesModel() extends JSpinner {
// in this class you handle the fact that now, you have an
// interval of values and a list of special values that are allowed.
// here is what I did :
@Override
public Object getNextValue() {
return incrValue(+1);
}
@Override
public Object getPreviousValue() {
return incrValue(-1);
}
private Object incrValue(int dir) {
// NB : BigDecimal here because this is what I used,
// but use what you want in your model
BigDecimal result = null;
BigDecimal numberBD = new BigDecimal(getNumber().toString());
BigDecimal stepSizeBD = new BigDecimal(getStepSize().toString());
BigDecimal dirBD = new BigDecimal(dir);
BigDecimal nextValue = numberBD.add(stepSizeBD.multiply(dirBD));
TreeSet<BigDecimal> currentAllowedValues = new TreeSet<BigDecimal>();
currentAllowedValues.addAll(m_SpecialValues);
if (getMaximum() != null) {
currentAllowedValues.add((BigDecimal) getMaximum());
}
if (getMinimum() != null) {
currentAllowedValues.add((BigDecimal) getMinimum());
}
if (isIncludedInBounds(nextValue)) {
currentAllowedValues.add(nextValue);
}
if (dir > 0) {
try {
result = currentAllowedValues.higher(numberBD);
}
catch (NoSuchElementException e) {}
}
else if (dir < 0) {
try {
result = currentAllowedValues.lower(numberBD);
}
catch (NoSuchElementException e) {}
}
return result;
}
}
在 SpecialValuesSpinnerEditor 中,我们使用 Document Listener 来自动完成(很容易做到,只需搜索 SO)。
public class SpecialValuesSpinnerEditor extends DefaultEditor implements DocumentListener {
// You have to do in your contructor
SpecialValuesSpinnerFormatter formatter =
new SpecialValuesSpinnerFormatter (spinner.getSpecialValues(), format);
getTextField().setFormatterFactory(new DefaultFormatterFactory(formatter));
}
现在,最重要的是格式化程序,它在用户输入(字符串)和数字之间进行转换,并处理模型的显示:
public class SpecialValuesSpinnerFormatter extends NumberFormatter {
// Just override the methos StringToValue and ValueToString.
// You can check here if the value is special
// i.e you must display its special text instead. e.g. : "Auto" instead of -1
}
关于java - JSpinner : how to display both numbers and text?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15684196/
我正在尝试让 JSpinner(包含分/秒计时器)为一群按自己的方式工作的人工作,他们不关心鼠标,但希望每次击键都能准确地完成他们的任务习惯了。它几乎按照我想要的方式工作,但最后一英里是最难的。 这在
我正在 netbeans 中构建一个小型应用程序,我使用 JSpinner 组件来设置产品的数量。如何将微调器设置为仅取正值?在 Netbeans 中是否有可以设置的选项或方法JSpinner ? 额
我正在使用 JAVA 开发 i18n 应用程序。 我正在使用 JSpinner与 String[]作为模型以允许用户选择某些选项。 我的问题是 JSpinner 中的文本正在因语言而变化。 所以我不想
Quick picture to show what is happening JSpinner 出现了两次,如上图所示。第一次出现在不应该出现的点 (0,0) 处的情况下,如果没有微调按钮,则无法选
我的问题是 JSpinner(在代码中名为 spinnerCantidadPuntas)有时根本不显示,或者只是有错误。当我运行项目(F6)时,它几乎肯定无法正确显示,当我调试它(CTRL+F5)
我可以使用 getValue() 获取当前值,但是是否可以获取 JSpinner 的最大和最小允许值?从文档中找不到 JSpinner 的 getMax() 或 getMin() 等方法。 http:
这个问题已经有答案了: How to set JSpinner as non editable? (3 个回答) 已关闭 9 年前。 如何制作一个不允许手动输入的 JSpinner。我希望我的微调器只
过去一个月我一直在开发 GUI,我发现 JSpinner 无法正确显示。只出现边框,没有数字,没有箭头,看图: 我可以判断某个组件何时启用或未启用,但这不是问题所在。 入门类,其中 MAIN 方法是:
我创建了以下类,它扩展了 JSpinner 以迭代 dd/mm/yyy 值。 public class DateSpinner extends JSpinner{ Calendar calen
当我的 JSpinner 为空时,我想采用 null 值。但当我调用 getValue() 函数时,它返回 0.0 。 public JFormattedTextField getTextFiel
我试图实现以下目标。 我想使用一个使用数字作为数据的 JSpinner,但我想让它像这样渲染:“6/10”,即“值/最大值”,其中默认的 JSpinner 只显示“值” 。当然,我使用 Spinner
我有一个带有 ChangeListener 定向的 JSpinner 。但只有当我按 Enter 或单击其中一个 JSpinner 按钮时,才会激活 ChangeListener 。我想知道如何在值更
我得到了步长为 0.01 的 JSpinner,但 getValue() 似乎返回奇数值。 举个例子:它是 0.06,如果我增加它,它有时会显示 0.069999999999999999 而不是 0.
我有一个 JSpinner,我创建它并将其添加到屏幕上,然后使用 setValue 更新它的值。如果我随后调用 getValue,则会返回正确的更新值。但它没有显示在 UI 上,当我单击按钮递增时,它
我有一个 JSpinner,其中所有整数都作为 model。我希望它的值随着向下箭头而增加,并且随着向上箭头而减少,这与默认用法完全相反。 我已经使用具有先前值的变量完成了此操作,并添加了一个 Cha
所以我的问题是,我之前在 Jspinners 上也遇到过这个问题。是我用标题边框包围我的 jspinner 吗?然而,在 GUI 中,它会剪切标题文本,因为 js 较小。那么,我如何强制 gui 根据
我有一个类,其中有两个 JSpinner 对象,x 和 y。我有一个更改监听器,它已添加到两者中。有人可以告诉我如何实现我的更改监听器,以便监听器可以区分两个对象之间的区别。例如伪代码: if(sou
我想同时允许“逗号”和“点”作为 double 分隔符。 我可以在字符串中使用 replace 方法来只获取一个分隔符,但问题是 double 值是 JSpinner 的值,我无法找到任何允许两个分隔
我有数组 JSpinners,但我无法监听。 这个不起作用,因为 Java 需要最终变量。当我将 spin4[j] 更改为 spin4[0] <- 它正在工作。但我需要带有 JSpinners 的数组
下面这段代码实际上做了什么, //Make the year be formatted without a thousands separator. spinner.setEdito
我是一名优秀的程序员,十分优秀!