Cómo establecer la orientación de JTextArea de derecha a izquierda (dentro de JOptionPane)

Tengo JScrollPane con JTextArea dentro y estoy intentando establecer la orientación de JTextArea de derecha a izquierda para que el texto dentro de él comience desde la derecha y la barra de desplazamiento esté a la izquierda

Intenté lo siguiente, pero no afectaron la dirección de la orientación:

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

EDITAR:

Las dos respuestas de Camickr & Trashgod proporcionaron un buen resultado, pero no en mi progtwig, donde uso mi JTextArea como un objeto Message y lo paso a OptionPane.

EDIT2:

Me di cuenta de que setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); no funciona si lo aplico en los contenidos de JOptionPane … ¿hay alguna solución alternativa a este problema?

Similar a mi código:

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

y la barra de desplazamiento estará a la izquierda

 scrollPane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 

así que el texto dentro de él comenzará desde la derecha

 textArea.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 

El texto comienza en el lado derecho, pero aún se agrega al final mientras escribe en lugar de insertarse al principio de la línea.

Actualizar:

No sé por qué no funciona en un panel de opciones. Aquí hay una solución simple:

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

Esto parece funcionar

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

esta línea

setComponentOrientation (ComponentOrientation.RIGHT_TO_LEFT)

cambie el orden correcto de las palabras.

tengo este resultado

KBytes 80.78

Las siguientes líneas resolvieron mi problema:

 jTextArea1.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); jTextArea1.setText(); 

Sirven para:

  1. setComponentOrientation() cambia la orientación de TextArea ; y,
  2. setText() actualiza TextArea inmediatamente para que se muestre correctamente

Simplemente establecer ComponentOrientation en RIGHT_TO_LEFT no es suficiente por sí mismo. repaint() no obliga al texto a realinearse. Una solución rápida para mí fue actualizar el contenido de TextArea. Eso obligó al texto a realinearse.