Avoiding Swing Threading Problems
Problem
You want to test Swing functions that dispatch to the AWT event queue, such as focus traversal.
Solution
Write a utility method to wait until pending AWT event queue messages are processed.
Discussion
Suppose you want to test the focus traversal order of the
PersonEditorPanel introduced in the previous
recipe. You want to ensure that focus travels from component to
component in the correct order as the user hits the tab key. To do
this, you write the following test:
public void testTabOrder( ) {
JTextField firstNameField = this.tannerPanel.getFirstNameField( );
firstNameField.requestFocusInWindow( );
// simulate the user hitting tab
firstNameField.transferFocus( );
// ensure that the last name field now has focus
JTextField lastNameField = this.tannerPanel.getLastNameField( );
assertTrue("Expected last name field to have focus",
lastNameField.hasFocus( ));
}As written, this test fails. First and foremost, the components must
be visible on screen before they can obtain focus. So you try
modifying your setUp( ) method as follows:
protected void setUp( ) throws Exception {
this.emptyPanel = new PersonEditorPanel( );
this.tanner = new Person("Tanner", "Burke");
this.tannerPanel = new PersonEditorPanel( );
this.tannerPanel.setPerson(this.tanner);
getTestFrame().getContentPane( ).add(this.tannerPanel,
BorderLayout.CENTER);
getTestFrame().pack( );
getTestFrame().show( );
}This takes advantage of the JFrame provided by our
base class, SwingTestCase
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access