Java - Custom PropertyEditorSupport для отображения единиц

Все,

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

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

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

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


person I82Much    schedule 19.05.2010    source источник


Ответы (1)


Лучшее решение, которое я нашел, - это изменить 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, чтобы текст соответствовал редакторам свойств по умолчанию; LINE_HEIGHT_PIXELS равно 15.

person I82Much    schedule 20.05.2010