如何从右到左设置JTextArea的方向(在JOptionPane内)

时间:2011-06-25 02:00:52

标签: java swing arabic jtextarea

我的JScrollPane内有JTextArea,我正在尝试从右到左设置JTextArea的方向,因此其中的文本将从右侧开始,滚动条将在左侧< / p>

我尝试了以下但是它们并没有影响方向:

txt.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
txt.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
txt.setAlignmentX(JTextArea.RIGHT_ALIGNMENT);

修改

两个答案camickr&amp; trashgod提供的工作正常但不在我的程序中,我使用我的JTextArea作为对象Message并将其传递给OptionPane。

EDIT2:

我发现如果我将setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);应用于JOptionPane内容,import java.awt.*; import java.util.*; import javax.swing.*; public class TextArea extends JPanel { private JTextArea txt = new JTextArea(); public TextArea() { setLayout(new GridLayout()); txt.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); JScrollPane scroll = new JScrollPane(txt); scroll.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); setPreferredSize(new Dimension(200,200)); this.add(scroll); } private void display() { Object[] options = {this}; JOptionPane pane = new JOptionPane(); int option = pane.showOptionDialog(null, null, "Title", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]); } public static void main(String[] args) { new TextArea().display(); } } 不起作用..是否有另一种解决此问题的方法?

与我的代码相似:

{{1}}

4 个答案:

答案 0 :(得分:8)

  

,滚动条将位于左侧

scrollPane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
  

所以里面的文字将从右边开始

textArea.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

文本从右侧开始,但在您键入时仍然会追加到末尾,而不是插入到行的开头。

更新

我不知道为什么它在选项窗格中不起作用。这是一个简单的解决方案:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;

public class Test
{
    public static void main(String args[]) throws Exception
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JTextArea textArea = new JTextArea(4, 20);
                JScrollPane scrollPane = new JScrollPane( textArea );
                JPanel panel = new JPanel();
                panel.add( scrollPane );

                scrollPane.addAncestorListener( new AncestorListener()
                {
                    public void ancestorAdded(AncestorEvent e)
                    {
                        JScrollPane scrollPane = (JScrollPane)e.getComponent();
                        scrollPane.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
                    }

                    public void ancestorMoved(AncestorEvent e) {}
                    public void ancestorRemoved(AncestorEvent e) {}
                });

                JOptionPane.showMessageDialog(null, panel);
            }
        });
    }
}

答案 1 :(得分:7)

这似乎有效。

enter image description here

import java.awt.ComponentOrientation;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.Locale;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/** @see http://stackoverflow.com/questions/6475320 */
public class RTLTextArea extends JPanel {

    private static final String s = "مرحبا العالم";
    private JTextArea jta = new JTextArea(7, 5);
    private Locale arabic = new Locale("ar", "KW");
    private ComponentOrientation arabicOrientation =
        ComponentOrientation.getOrientation(arabic);

    public RTLTextArea() {
        this.setLayout(new GridLayout());
        this.add(new JScrollPane(jta));
        this.applyComponentOrientation(arabicOrientation);
        for (int i = 0; i < 8; i++) {
            jta.append(s + "\n");
        }
    }

    private void display() {
        JFrame f = new JFrame("RTLTextAre");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new RTLTextArea().display();
            }
        });
    }
}

答案 2 :(得分:2)

这一行

  

setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT)

更改单词的正确顺序。

我有这个结果

  

KBytes 80.78

答案 3 :(得分:0)

以下几行解决了我的问题:

jTextArea1.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
jTextArea1.setText(<text>);

它们的作用是:

  1. setComponentOrientation()更改TextArea的方向;并且,
  2. setText()立即刷新TextArea使其正确显示

仅将ComponentOrientation设置为RIGHT_TO_LEFT本身是不够的。 repaint()不会强制文本重新对齐。对我来说,一种快速的解决方案是更新TextArea的内容。这迫使文本重新对齐。