How do I alter the reading order of components in a JPanel? When I change a panel's Locale to one with a Right to Left order, the components are still laid out Left to Right.
Created May 4, 2012
Joe Sam Shirah The general answer in 1.2 or later is to use ResourceBundles and then call Window.applyResourceBundle(). This will do all the grunt work for you so FlowLayout and BorderLayout can take accout of the order. Just setting the locale does nothing for the reading order or ComponentOrientation, to use the API term. In that case, one also has to call
setComponentOrientation(ComponentOrientation o)for each component affected.
I've included code that will cause components in a panel to change from left to right ( assuming that is the initial default, ) to right to left, using the locale for arabic - Kuwait. Note that only the JPanel ( and its LayoutManager ) is affected.
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class JRTLLocale extends JFrame implements ActionListener, WindowListener { boolean boolInitial = true; JButton jb = new JButton( "Initial/RTL" ); JLabel jl = new JLabel("Locale Country"); JPanel jp = new JPanel(); JTextField jt = new JTextField( getLocale().getDisplayCountry()); Locale lRTL = new Locale( "ar", "KW" ), // Kuwait lInitial = getLocale(); public JRTLLocale() { super( "JRTLLocale" ); addWindowListener( this ); jb.addActionListener( this ); jp.add(jl); jp.add(jt); jp.add(jb); Container myCP = getContentPane(); myCP.add( jp, BorderLayout.CENTER ); pack(); show(); } // end constructor // ActionListener Implementation public void actionPerformed(ActionEvent e) { if( boolInitial ) { jp.setLocale( lRTL ); } else { jp.setLocale( lInitial ); } jp.setComponentOrientation( ComponentOrientation.getOrientation( jp.getLocale() ) ); jt.setText( jp.getLocale().getDisplayCountry() ); boolInitial = !boolInitial; // toggle jp.doLayout(); pack(); } // End actionPerformed // Window Listener Implementation public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} // End Window Listener Implementation public static void main(String[] args) { new JRTLLocale(); } } // end class JRTLLocale