2010-05-19 2 views
0

Все,Java - Custom PropertyEditorSupport для отображения единиц измерения

Я пытаюсь, чтобы свойства моего узла имели единицы, связанные с мерой. (Я использую реализацию 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; 
    } 
} 

Вот скриншот дисплея - Мне нравится, как это .. alt text http://grab.by/grabs/b921a00e5167596c14d9d1d1d359561b.png

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

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

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

ответ

0

Лучшее решение, которое я нашел, это изменить 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.

Смежные вопросы