A demo is better than a thousand words. Copy the code to a file FocusTraversal.java and compile and run it.
package tsul.example; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.lang.reflect.Field; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JButton; import javax.swing.JTextArea; import javax.swing.SwingUtilities; public class FocusTraversal extends JPanel { JButton b1 = new JButton("Columns"); JButton b2 = new JButton("Rows"); JTextArea content = new JTextArea("Textarea"); /** * This is the main pane */ JScrollPane pane = new JScrollPane(); public FocusTraversal() { super(new BorderLayout()); pane.setColumnHeaderView(b1); // Try to add a duplicate component to pane's header. In such a case, // the default // LayoutFocusTraversalPolicy won't work properly as expected. The // result is we // cannot move focus from Columns to Rows by tabling. try { Field f = Container.class.getDeclaredField("component"); // bypass default security check f.setAccessible(true); ArrayList comp = (ArrayList) f.get(pane.getColumnHeader()); comp.add(b1); } catch (Exception e) { e.printStackTrace(); } pane.setRowHeaderView(b2); pane.setViewportView(content); setPreferredSize(new Dimension(600, 400)); add(pane, BorderLayout.CENTER); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { frame = new JFrame("Focus Traversal Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); FocusTraversal panel = new FocusTraversal(); frame.getContentPane().add(panel); frame.pack(); frame.setVisible(true); } }); } static JFrame frame; }