【问题标题】:AS3 - Right alignment in DataGrid not working as I expectedAS3 - DataGrid 中的右对齐未按预期工作
【发布时间】:2012-12-20 01:46:00
【问题描述】:

是的,所以我有一个DataGrid 有两列。在左列中,我希望文本向右对齐:更具体地说,如果列太小而无法显示整个文本,我希望它包含最右边的内容。

我设法通过创建一个扩展CellRenderer 的自定义类并将DataGridcellRenderer 属性设置为该类来对齐它,如this article 中指定的那样。但是,这并不完全符合我的要求。它确实将文本向右对齐,但如果列太小而无法容纳所有文本,它仍然只显示最左边的部分。

有人知道我怎样才能让它显示文本的最右边吗?

您知道,这是在 FlashDevelop 中的纯 AS3 AIR 应用程序中,我的 CellRenderer 类与我在上面链接到的文章中的类相同(即 RightAlignCell)。

【问题讨论】:

  • 您是否尝试更改textFieldx 属性?
  • 只是为了清楚它按预期工作。右对齐并不意味着“显示最右边的内容”。
  • @Gio:是的,不幸的是,这似乎没有任何效果。 @SunilD:我猜你是对的,但我的意思是它没有按我的预期工作。在 Excel 等程序中,右对齐会执行此操作,因此我认为 Flash 的 DataGrid 也是如此。无论如何固定标题以反映这一点。
  • 我不在我的电脑自动取款机旁,等我到了那里我会试一试。我认为设置正确的对齐方式并将 textField 的 x 属性设置为 this.width - textField.width 会做你想做的事。
  • @Gio:这对我不起作用,但请随意尝试。如果它有效,我的代码一定有一些奇怪的地方。编辑:啊哈,发现了问题。似乎textField 的宽度更改为适合列内,这意味着找到两者之间的差异会导致 +5。我从CellRenderer 中覆盖的drawLayout 函数中删除了super.drawLayout(),它似乎消除了具体问题,但出现了很多很多。

标签: actionscript-3 datagrid alignment right-align


【解决方案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,正如 Gio 建议的那样,它应该会给出所需的结果,它只会将 x 增加 5 个像素。 我再次发现问题出在super.drawLayout()。似乎它正在调整textField 的宽度以适合列内,这就是我的计算不起作用的原因。我试图删除它的功能,但这是一团糟,因为它处理了列正确显示所需的大量代码。所以相反,我想使用autoSize 属性使textField 自动调整到适当的宽度,即使super.drawLayout() 调整了它的大小:

        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;
        }

    }

}

textField.x 减去 5 个像素只是为了使文本看起来更好,而不是触及列的边框。

抱歉,虽然解决方案很简单,但我决定深入解释一下。基本上我只是想出了上面的课程,它奏效了。

【讨论】:

  • 如果将autoSize 设置为TextFieldAutoSize.RIGHT,则不需要setTextFormat
猜你喜欢
  • 2022-01-21
  • 2019-12-25
  • 1970-01-01
  • 2017-10-01
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多