How to set the orientation of JTextArea from right to left (inside JOptionPane)

后端 未结 4 443
孤城傲影
孤城傲影 2020-11-27 22:54

I have JScrollPane with JTextArea inside it and I am trying to set the JTextArea\'s orientation from right to left so the text inside it will start

相关标签:
4条回答
  • 2020-11-27 23:20

    The following lines solved my problem:

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

    They serve to:

    1. setComponentOrientation() changes the orientation of the TextArea; and,
    2. setText() refreshes TextArea immediately so it displays properly

    Simply setting ComponentOrientation to RIGHT_TO_LEFT is not sufficient by itself. repaint() doesn't force the text to realign itself. A quick solution for me was to update the contents of the TextArea. That forced the text to realign itself.

    0 讨论(0)
  • 2020-11-27 23:30

    This seems to work.

    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();
                }
            });
        }
    }
    
    0 讨论(0)
  • 2020-11-27 23:41

    this line

    setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT)

    change the correct order of the words.

    i have this result

    KBytes 80.78

    0 讨论(0)
  • 2020-11-27 23:42

    and the scrollbar will be on the left

    scrollPane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    

    so the text inside it will start from the right

    textArea.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    

    The text starts on the right side, but still gets append to the end as you type instead of being inserted at the beginning of the line.

    Update:

    I don't know why it doesn't work in an option pane. Here is a simple solution:

    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);
                }
            });
        }
    }
    
    0 讨论(0)
提交回复
热议问题