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
Я просто сделал немного позиционирования, чтобы текст выглядел лучше, вместо того, чтобы касаться границы столбца.
Извините за столь длинный пост, пока решение простое, но я решил объяснить его подробно. В основном я только что придумал класс выше, который работал.