AS3 - правое выравнивание в DataGrid не работает, как я ожидал

Хорошо, поэтому у меня есть DataGrid с двумя колоннами. В левом столбце я хочу, чтобы текст был выровнен по правому краю: более конкретно, если столбец слишком мал, чтобы показать весь текст, я хочу, чтобы он содержал самое правое содержимое.

Мне удалось выровнять его, сделав собственный класс, расширяющий CellRenderer и настройка DataGrid"s cellRenderer Свойство для класса, как указано в этой статье. Тем не менее, это не работает именно так, как я хочу. Он действительно выравнивает текст вправо, но если столбец слишком мал, чтобы вместить весь текст, он по-прежнему показывает только самый левый раздел.

Кто-нибудь знает, как я могу сделать так, чтобы вместо него отображалась самая правая часть текста?

Просто чтобы вы знали, это в чистом приложении AS3 AIR во FlashDevelop, и мой CellRenderer класс такой же, как в статье, на которую я ссылался выше (т.е. RightAlignCell).

1 ответ

Решение

Вот мой оригинальный код CellRenderer:

package  
{
    import fl.controls.listClasses.CellRenderer;
    import fl.controls.listClasses.ICellRenderer;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;

    public class RightAlignCell extends CellRenderer implements ICellRenderer
    {
        private var tf:TextFormat;

        public function RightAlignCell() 
        {
            tf = new TextFormat();
            tf.align = TextFormatAlign.RIGHT;
        }

        override protected function drawLayout():void
        {
            textField.setTextFormat(tf);
            super.drawLayout();
        }

    }

}

Тем не менее, изменение значения textField.x не имел никакого эффекта. Я подумал, что это потому, что я звонил super.drawLayout() в конце моей переопределенной версии, которая, по-видимому, вернула значение по умолчанию. Если я назвал это в начале, изменив x сработало (я использую -50 здесь как заметный пример):

        override protected function drawLayout():void
        {
            super.drawLayout();
            textField.setTextFormat(tf);
            textField.x = -50;
        }

Однако, если я попытался установить значение this.width - textField.width, как предположил Джио, должен дать желаемый результат, он только увеличил x на 5 пикселей. Я обнаружил, что проблема была, опять же, super.drawLayout(), Похоже, что это было изменение размера textFieldШирина вписывается в столбец, поэтому мой расчет не сработал. Я попытался удалить функцию, но это было большим беспорядком, поскольку он обрабатывал много кода, необходимого для правильного отображения столбца. Так что вместо этого я решил сделать textField изменить размер автоматически до нужной ширины, даже когда super.drawLayout() изменил размер, используя autoSize имущество:

        override protected function drawLayout():void
        {
            super.drawLayout();
            textField.setTextFormat(tf);
            textField.autoSize = TextFieldAutoSize.LEFT;
            textField.x = this.width - textField.width;
        }

Теперь это сработало, хотя и с несколькими заминками. Однако они были минимальными и были исправлены путем перемещения строк, определяющих формат текста, и автоматического изменения размера в конструктор CellRenderer (что я понял, я должен был сделать в первую очередь в любом случае). В конце мой последний функциональный класс был таким:

package  
{
    import fl.controls.listClasses.CellRenderer;
    import fl.controls.listClasses.ICellRenderer;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;
    import flash.text.TextFieldAutoSize;

    public class RightAlignCell extends CellRenderer implements ICellRenderer
    {
        private var tf:TextFormat;

        public function RightAlignCell() 
        {
            tf = new TextFormat();
            tf.align = TextFormatAlign.RIGHT;
            textField.setTextFormat(tf);
            textField.autoSize = TextFieldAutoSize.LEFT;
        }

        override protected function drawLayout():void
        {
            super.drawLayout();
            textField.x = this.width - textField.width - 5;
        }

    }

}

Вычитание 5 пикселей в textField.x Я просто сделал немного позиционирования, чтобы текст выглядел лучше, вместо того, чтобы касаться границы столбца.

Извините за столь длинный пост, пока решение простое, но я решил объяснить его подробно. В основном я только что придумал класс выше, который работал.

Другие вопросы по тегам