Re: How to change JPanels?
On Feb 16, 1:04 pm, Screamin Lord Byron <s...@min.dot> wrote:
On 16.02.2011 17:42, Eric wrote:
On Feb 16, 9:26 am, Lew <no...@lewscanon.com> wrote:
To summarize. There is one EDT. Swing handles that threading aut=
omatically.
<...>
From the Oracle docs:
public static boolean isEventDispatchThread()
Returns true if the current thread is an AWT event dispatching thread.
This is where you're confusing. You're saying there's one EDT.
Oracle says there's more. It does not say *the* EDT, it says *an*
EDT.
From:http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html
The single-thread rule: Swing components can be accessed by only
one thread at a time. Generally, this thread is the event-
dispatching thread. Once a Swing component has been realized, all
code that might affect or depend on the state of that component
should be executed in the event-dispatching thread.
Event dispatching: If you need access to the UI from outside
event-handling or drawing code, then you can use the SwingUtiliti=
es
invokeLater() or invokeAndWait() method.
...this thread is *the* event-dispatching thread...
...should be executed in *the* event-dispatching thread
You don't believe it? You don't like it? Tough. Live with it or change a
career.
They use the word AN not THE. You may have a reading comprehension
problem. Try changing your career.
http://download.oracle.com/javase/7/docs/api/javax/swing/SwingUtilities.htm=
l#isEventDispatchThread()
Let me clarify what you just posted.
"Swing components can only be accessed by one thread AT A TIME."
"Generally THIS THREAD is the EDT."
That doesn't mean there's only one EDT thread. It means there's only
one active EDT thread.
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.
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;
public void run() {
System.out.println("initial: " +
javax.swing.SwingUtilities.isEventDispatchThread());
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 void addMenuItem(Menu menu, String menuItemTitle, String
menuItemName, ActionListener menuListener) {
System.out.println("add menu item: " +
javax.swing.SwingUtilities.isEventDispatchThread());
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() {
System.out.println("loading panel one: " +
javax.swing.SwingUtilities.isEventDispatchThread());
cardLayout.show(contentPane, "Panel One");
repaint();
}
public void loadTwo() {
System.out.println("loading panel two: " +
javax.swing.SwingUtilities.isEventDispatchThread());
cardLayout.show(contentPane, "Panel Two");
repaint();
}
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(new TestWindow());
}
}