Java - Custom PropertyEditorSupport для отображения единиц - PullRequest
0 голосов
/ 19 мая 2010

All

Я пытаюсь сделать так, чтобы свойства моего узла имели Единицы, связанные с мерой. (Я использую JScience.org реализацию JSR 275). Например,

public class Robot extends AbstractNode {
    // in kg
    float vehicleMass;

    @Override
    public Sheet createSheet() {
        Sheet s = Sheet.createDefault();
        Sheet.Set set = s.createPropertiesSet();
        try {
            PropertySupport.Reflection vehicleMassField = new PropertySupport.Reflection(this, float.class, "vehicleMass");
            vehicleMassField.setValue("units", SI.KILOGRAMS);
            vehicleMassField.setName("vehicleMass");
            set.put(vehicleMassField);

            PropertyEditorManager.registerEditor(float.class, UnitInPlaceEditor.class);
        } catch (NoSuchMethodException ex) {
            Exceptions.printStackTrace(ex);
        }
        s.put(set);
        return s;
    }
}

Я хочу, чтобы мой UnitInPlaceEditor добавлял единицы измерения в конец строкового представления числа, и при щелчке поля (вход в режим редактирования) единицы исчезают, и для редактирования выбирается только число. Я могу заставить единицы отображаться, но не могу заставить единицы исчезнуть, когда поле входит в режим редактирования.

public class UnitsInplaceEditor extends PropertyEditorSupport implements ExPropertyEditor {

    private PropertyEnv pe;

    @Override
    public String getAsText() {
        // Append the unit by retrieving the stored value
    }

    @Override
    public void setAsText(String s) {
        // strip off the unit, parse out the number
    }

    public void attachEnv(PropertyEnv pe) {
        this.pe = pe;
    }
}

Вот скриншот дисплея - мне нравится вот так .. альтернативный текст http://grab.by/grabs/b921a00e5167596c14d9d1d1d359561b.png

но вот редактируемое значение; обратите внимание, что устройство остается там. альтернативный текст http://grab.by/grabs/81e3aadf8c9b1185adc09e14e91a0aae.png

В основном я хочу, чтобы одно значение (строка) отображалось в поле, когда поле НЕ редактируется, и другое, которое должно отображаться, когда пользователь начинает редактировать поле. За исключением этого, я хотел бы поставить постоянную метку для единиц (не редактируемых) справа от текстового поля.

Кто-нибудь знает, как это сделать?

1 Ответ

0 голосов
/ 20 мая 2010

Лучшее решение, которое я нашел, было изменить getAsText (), чтобы он возвращал не значение + единицы, а только значение. То же самое с setAsText. Таким образом, я могу использовать InplaceEditor по умолчанию, и юниты исчезают в этом представлении.

Чтобы отобразить единицы измерения в невыбранном представлении, мне пришлось переопределить методы isPaintable и paintValue следующим образом:

@Override
public boolean isPaintable() {
    return true;
}

/**
 * Draws the number and unit in the rectangular region of the screen given
 * to this PropertyEditor.
 * @param gfx
 * @param box
 */
@Override
public void paintValue(Graphics gfx, Rectangle box) {
    Color oldColor = gfx.getColor();
    gfx.setColor(isEditable() ? EDITABLE_COLOR : NON_EDITABLE_COLOR);
    // drawString takes x, y of lower left corner of string, whereas the box
    // x, y is at the top left corner of the string; need to add to translate
    // to where the string should be drawn
    gfx.drawString(getAsText() + " " + getViewUnit(), 
            box.x + LEFT_MARGIN_PIXELS, box.y + LINE_HEIGHT_PIXELS);
    gfx.setColor(oldColor);
}

Как примечание, LEFT_MARGIN_PIXELS = 0, чтобы текст соответствовал стандартным PropertyEditors; LINE_HEIGHT_PIXELS - 15.

...