【问题标题】:How to align RIGHT the content of TextArea in LWUIT?如何在 LWUIT 中对齐 TextArea 的内容?
【发布时间】:2019-06-25 09:00:00
【问题描述】:

我想将TextArea 中的文本向右对齐。我尝试了以下代码:

     Form form = new Form();
     TextArea textArea = new TextArea("Some Arabic text ...");
     textArea.setRTL(true);
     textArea.setAlignment(RIGHT);
     form.addComponent(textArea);


结果只是将滚动条向左移动,
但是文字仍然没有对齐RIGHT,
查看下图:

那么如何将内容与RIGHT对齐?

【问题讨论】:

    标签: java-me lwuit lwuit-textarea


    【解决方案1】:

    对于第一个实例来说这听起来很疯狂 :) 但是将对齐设置为 TextArea.LEFT 解决了这个问题,现在它是 RIGHT 对齐的!

        Form form = new Form();
        TextArea textArea = new TextArea("Some Arabic text ...");
        textArea.setRTL(true);
        textArea.setAlignment(TextArea.LEFT);
        form.addComponent(textArea);
    

    将其设置为LEFT 使显示的文本RIGHT 对齐!

    或者删除镜像显示的textArea.setRTL(true)

        Form form = new Form();
        TextArea textArea = new TextArea("Some Arabic text ...");
        textArea.setAlignment(TextArea.RIGHT);
        form.addComponent(textArea);
    



    对于那些对设置为 RTL 时更复杂的细节感兴趣的人:
    TextArea 类的 paint 方法是

    public void paint(Graphics g) {
        UIManager.getInstance().getLookAndFeel().drawTextArea(g, this);
    }
    

    而DefaultLookAndFeel中的drawTextArea方法如下:

    int align = ta.getAbsoluteAlignment();
    // remaining code is here in initial source
    switch(align) {
         case Component.RIGHT:
              x = ta.getX() + ta.getWidth() - rightPadding - f.stringWidth(displayText);
              break;
         // remaining code is here in initial source
    }
    g.drawString(displayText, x, y);
    

    不幸的是,TextArea.RIGHT 的值为 3
    但是当调用ta.getAbsoluteAlignment() 时它返回1(尽管对象的对齐方式是由代码设置为TextArea.RIGHT !!)
    同时TextArea.Left值为1
    这就是它与开关中的值匹配并与RIGHT对齐的原因

    顺便说一句,如果你设置了

    textArea.setAlignment(Component.RIGHT); 
    

    也会出错,因为paint方法外的Component.RIGHT的值是3而不是1!

    【讨论】:

    • 当您为TextArea 激活 RTL 时,文本呈现的方向是相反的,因此左被视为右。我建议您通过填写@LWUIT Java Form 的帖子从 Shai 那里得到澄清。从而为 LWUIT 社区做出贡献。
    • Vimal 是正确的。这听起来很奇怪,但一旦你考虑它就会有道理。当您激活双向时,默认情况下您实际上是在反转显示,因此右变为左,东变为西......这在 RTL 应用程序中是有道理的,因为在这些应用程序中,99% 的 UI 组件都希望做与英文版本完全相反的操作,因此您可以编写英文用户界面并将其本地化为bidi,只需翻译和翻转bidi开关。
    • 是的,只需在我最初的帖子中删除这行代码即可完成:textArea.setRTL(true); 并保持原样。感谢您的宝贵意见!
    • 顺便说一句,我认为 RIGHT 和 LEFT 不应该颠倒过来,这在术语上非常模棱两可,尤其是对于那些来自其他 API 背景的人。取而代之的是,我认为 RTL 标志应该自动将对齐布局设置为 RIGHT ,除非代码另有说明,这将避免误用这些术语。左应保持其名称与右相同。非常感谢您的澄清
    【解决方案2】:

    你只需要写'TextArea.RIGHT'而不是'RIGHT'

    textArea.setAlignment(TextArea.RIGHT);
    

    【讨论】:

    • 我试过TextArea.RIGHT,不幸的是文本仍然是左对齐的(顺便说一句,即使文本是英文,它也是左对齐的)!
    • 在同一个讨论帖中查看我的答案,这个解决方案太疯狂了 :) 非常感谢您的帮助,我会标记它 :)
    • TextArea.RIGHT 是 Component.RIGHT 它们是相等的。
    【解决方案3】:

    您可以使用以下行:

    TextArea textArea = new TextArea("Some Arabic text ...");
    textArea.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多