Re: How to change JPanels?
Eric wrote:
....
Follow this test program I posted previously. I fixed it to run on
EDT threads and added system print commands to show you there can be
multiple threads running at the same time as EDT threads.
Nevermind the inefficient do while loop to create the delay. It's not
a live application. It's a test class.
Your test case omitted the key check for what you are claiming. You only
check that things that should be invoked in the EDT do get a true result
from isEventDispatchThread(). In order to show what you claim, you would
need to check whether all those method calls happen in the same thread
or not. I've modified the program accordingly.
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;
import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;
public class TestWindow extends JFrame implements Runnable {
protected CardLayout cardLayout;
protected Container contentPane;
protected JPanel panelOne;
protected JPanel panelTwo;
private JTextArea dummyTextOne;
private JTextArea dummyTextTwo;
private Thread firstEDT;
public void run() {
boolean isEDT = javax.swing.SwingUtilities
.isEventDispatchThread();
System.out.println("initial: " + isEDT);
if (isEDT) {
checkEDTMatch("initial");
}
contentPane = getContentPane();
contentPane.setLayout(new CardLayout());
cardLayout = (CardLayout) contentPane.getLayout();
MenuBar menuBar = new MenuBar();
Menu menu = new Menu("Test");
addMenuItem(menu, "First", "FirstItem",
new FirstItemListener());
menuBar.add(menu);
setMenuBar(menuBar);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setSize(600, 600);
setLocation(100, 100);
panelOne = new JPanel();
contentPane.add(panelOne, "Panel One");
dummyTextOne = new JTextArea("Panel One");
panelOne.add(dummyTextOne);
panelTwo = new JPanel();
contentPane.add(panelTwo, "Panel Two");
dummyTextTwo = new JTextArea("Panel Two");
panelTwo.add(dummyTextTwo);
setContentPane(contentPane);
loadOne();
setVisible(true);
}
private synchronized void checkEDTMatch(String tag) {
if (firstEDT == null) {
System.out.println(tag + ": Found null firstEDT");
firstEDT = Thread.currentThread();
} else {
System.out
.println(tag + ": Current thread matches first EDT? "
+ (Thread.currentThread() == firstEDT));
}
}
private void addMenuItem(Menu menu, String menuItemTitle,
String menuItemName, ActionListener menuListener) {
boolean isEDT = javax.swing.SwingUtilities
.isEventDispatchThread();
System.out.println("add menu item: "
+ isEDT);
if(isEDT){
checkEDTMatch("addMenuItem");
}
MenuItem menuItem = new MenuItem(menuItemTitle);
menuItem.setActionCommand(menuItemName);
menuItem.addActionListener(menuListener);
menu.add(menuItem);
}
protected class FirstItemWorker extends SwingWorker {
BufferedImage[] renderedPngPages = null;
int waitTime;
protected FirstItemWorker(int waitTimeIn) {
waitTime = waitTimeIn;
}
protected Integer doInBackground() {
long t0, t1;
t0 = System.currentTimeMillis();
do {
t1 = System.currentTimeMillis();
} while ((t1 - t0) < (waitTime));
return 0;
}
protected void done() {
if (isCancelled()) {
return;
}
loadOne();
}
}
private class FirstItemListener implements ActionListener {
public void actionPerformed(ActionEvent ev) {
loadTwo();
FirstItemWorker fiw = new FirstItemWorker(3000);
fiw.execute();
}
}
protected void loadOne() {
boolean isEDT = javax.swing.SwingUtilities
.isEventDispatchThread();
System.out.println("loading panel one: " + isEDT);
if (isEDT) {
checkEDTMatch("loadOne");
}
cardLayout.show(contentPane, "Panel One");
repaint();
}
public void loadTwo() {
boolean isEDT = javax.swing.SwingUtilities
.isEventDispatchThread();
System.out.println("loading panel two: " + isEDT);
if (isEDT) {
checkEDTMatch("loadTwo");
}
cardLayout.show(contentPane, "Panel Two");
repaint();
}
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(new TestWindow());
}
}