Поместите иконку DateField влево в поле TextInput. - PullRequest
1 голос
/ 31 марта 2011

Что касается dateField, есть TextInput и значок. Я хочу, чтобы значок отображался слева от TextInput, а не справа, как в состоянии по умолчанию.

Может кто-нибудь дать мне подсказку об этом?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2011

Поскольку DateField по-прежнему является компонентом Halo, вам необходимо расширить его, чтобы иметь возможность изменять его дочерние элементы. Вы захотите создать новый компонент, расширить DateField, а затем переопределить функции createChildren и updateDisplayList. Проверьте, как DateField создает своих детей, и соответственно измените их местоположение. Функция updateDisplayList предназначена для изменения размеров компонента, чтобы вы могли правильно изменять размеры дочерних элементов.

1 голос
/ 09 июня 2011

Смотрите здесь (см. Исходный код).Есть автозапрашивающий компонент, но принцип тот же.Или этого должно быть достаточно:

public class myDateField extends DateField
{
    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
    {
        super.updateDisplayList(unscaledWidth,unscaledHeight);
        this.textInput.x=this.getChildAt(1).width;
        this.getChildAt(1).x = 0;
    }       
}
0 голосов
/ 31 декабря 2011

Вот что я сделал - то же самое решение, описанное J_A_X, но с кодом, потому что я думаю, что способ, которым Adobe устанавливает положение, немного сбивает с толку, если вы новичок в ActionScript. Мне нравится подход ChRapO, но я решил попытаться соответствовать тому, как компонент MX DateField устанавливает положение этих элементов.

Мой расширенный класс DateField:

package com.escalationpoint.tagger.view.component
{
import mx.controls.DateField;
import mx.core.mx_internal;

use namespace mx_internal;


public class DateField extends mx.controls.DateField
{
    public function DateField()
    {
        super();
    }

    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
    {
        // Unfortunate that we can't call super.super.updateDisplayList
        // since we're redoing work done in super.updateDisplayList.  Oh, well...
        super.updateDisplayList(unscaledWidth, unscaledHeight);

        var w:Number = unscaledWidth;
        var h:Number = unscaledHeight;

        var arrowWidth:Number = downArrowButton.getExplicitOrMeasuredWidth();
        var arrowHeight:Number = downArrowButton.getExplicitOrMeasuredHeight();

        textInput.setActualSize(w - arrowWidth - 2, h);
        textInput.move(arrowWidth + 4, 0);

        downArrowButton.setActualSize(arrowWidth, arrowHeight);
        downArrowButton.move(0, Math.round((h - arrowHeight) / 2));
    }
    }
}

Сравните с методом updateDisplayList в исходном компоненте DateField:

override protected function updateDisplayList(unscaledWidth:Number,
                                              unscaledHeight:Number):void
{
    super.updateDisplayList(unscaledWidth, unscaledHeight);

    var w:Number = unscaledWidth;
    var h:Number = unscaledHeight;

    var arrowWidth:Number = downArrowButton.getExplicitOrMeasuredWidth();
    var arrowHeight:Number = downArrowButton.getExplicitOrMeasuredHeight();

    downArrowButton.setActualSize(arrowWidth, arrowHeight);
    downArrowButton.move(w - arrowWidth, Math.round((h - arrowHeight) / 2));

    textInput.setActualSize(w - arrowWidth - 2, h);
}
...