FileDocCategorySizeDatePackage
AWTBlockDemo.javaAPI DocExample5153Mon Jan 09 11:02:02 GMT 2006None

AWTBlockDemo.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;

public class AWTBlockDemo extends JFrame {

    JButton blockButton, dontBlockButton;
    JMenuItem blockMenuItem, dontBlockMenuItem, quitMenuItem;
    JTextField urlField;
    JTextArea contentArea;
    final static String DEFAULT_URL =
        "http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Component.html";
    Thread loaderThread;

    public AWTBlockDemo () {
        super ("AWT Thread Blocking");
        initMainLayout();
        initMenus();
        initActions();
    }

    private void initMainLayout() {
        urlField = new JTextField (DEFAULT_URL, 60);
        JPanel topPanel = new JPanel ();
        topPanel.setLayout (new BoxLayout (topPanel, BoxLayout.Y_AXIS));
        topPanel.add (urlField);
        JPanel buttonPanel = new JPanel();
        blockButton = new JButton ("Load (blocking)");
        dontBlockButton = new JButton ("Load (non-blocking)");
        buttonPanel.add (blockButton);
        buttonPanel.add (dontBlockButton);
        topPanel.add (buttonPanel);
        contentArea = new JTextArea (25, 60);
        JScrollPane scroller = 
            new JScrollPane (contentArea,
                             ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
                             ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add (topPanel, BorderLayout.NORTH);
        getContentPane().add (scroller, BorderLayout.CENTER);
    }

    private void initMenus() {
        JMenuBar bar = new JMenuBar();
        JMenu fileMenu = new JMenu ("File");
        blockMenuItem = new JMenuItem ("Load (blocking)");
        dontBlockMenuItem = new JMenuItem ("Load (non-blocking)");
        fileMenu.add (blockMenuItem);
        fileMenu.add (dontBlockMenuItem);
        fileMenu.addSeparator();
        quitMenuItem = new JMenuItem ("Quit");
        fileMenu.add (quitMenuItem);
        bar.add (fileMenu);
        setJMenuBar (bar);
    }

    private void initActions() {
        quitMenuItem.addActionListener (new QuitAction());
        BlockingLoadAction blocker = new BlockingLoadAction();
        blockButton.addActionListener (blocker);
        blockMenuItem.addActionListener (blocker);
        NonBlockingLoadAction nonBlocker = new NonBlockingLoadAction();
        dontBlockButton.addActionListener (nonBlocker);
        dontBlockMenuItem.addActionListener (nonBlocker);
    }

    public static void main (String[] args) {
        AWTBlockDemo awtbd = new AWTBlockDemo();
        awtbd.pack();
        awtbd.setVisible (true);
    }
    
    public void loadURL(boolean useWorker) {
        try {
            URL url = new URL (urlField.getText());
            BufferedReader in =
                new BufferedReader (
                    new InputStreamReader (url.openStream()));
            StringBuffer sbuf = new StringBuffer();
            char[] buffy = new char [16 * 1024];
            int bytesRead = 0;
            while ((bytesRead = in.read (buffy, 0, buffy.length)) > -1) {
                sbuf.append (buffy, 0, bytesRead);
                // if your net connection is too fast to see blocking
                // add the following here:
                // Thread.sleep (50);
            }
            if (! useWorker) {
                contentArea.setText (sbuf.toString());
                contentArea.setCaretPosition(0);
            } else {
                final StringBuffer finalSBuf = sbuf;
                Thread worker = new Thread() {
                    public void run () {
                        contentArea.setText (finalSBuf.toString());
                        contentArea.setCaretPosition(0);
                    }
                };
                SwingUtilities.invokeLater (worker);
            }
        } catch (Exception e) {
            CharArrayWriter writer = new CharArrayWriter();
            e.printStackTrace (new PrintWriter (writer));
            contentArea.setText(writer.toString());
            contentArea.setCaretPosition(0);
        }
    }
    
    class QuitAction extends AbstractAction {
        public void actionPerformed (ActionEvent e) {
            System.exit(0);
        }
    }

    class BlockingLoadAction extends AbstractAction {
        public void actionPerformed (ActionEvent e) {
            // note that threaded version doesn't offer a means of
            // being interrupted so it refuses second launch instead
            if (loaderThread != null)
                return;
            loadURL(false);
        }
    }

    class NonBlockingLoadAction extends AbstractAction implements Runnable {
        // note that this doesn't offer a means of being interrupted
        // so it refuses second launch instead
        public void actionPerformed (ActionEvent e) {
            if (loaderThread != null)
                return;
            loaderThread = new Thread ((Runnable) this);
            loaderThread.start();
        }
        public void run() {
            loadURL(true);
            loaderThread = null;    
        }
    }

}