Mega Code Archive

 
Categories / Java / Design Pattern
 

Bridge pattern in Java

/* The Design Patterns Java Companion Copyright (C) 1998, by James W. Cooper IBM Thomas J. Watson Research Center */ import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.io.RandomAccessFile; import java.util.Vector; import javax.swing.AbstractListModel; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel; public class productDisplay extends JFrame {   public productDisplay() {     super("The Java Factory-- Products");     setLF(); //set look and feel     setCloseClick(); //set close on window close click     InputFile f = new InputFile("products.txt");     Vector prod = new Vector();     //read in product list     String s = f.readLine();     while (s != null) {       prod.addElement(s);       s = f.readLine();     }     JPanel p = new JPanel();     getContentPane().add(p);     p.setLayout(new GridLayout(1, 2));     JPanel pleft = new JPanel();     JPanel pright = new JPanel();     p.add(pleft);     p.add(pright);     pleft.setLayout(new BorderLayout());     pright.setLayout(new BorderLayout());     //add in customer view as list box     pleft.add("North", new JLabel("Customer view"));     pleft.add("Center", new productList(prod));     //add in execute view as table     pright.add("North", new JLabel("Executive view"));     pright.add("Center", new productTable(prod));     setSize(new Dimension(400, 300));     setVisible(true);   }   //-----------------------------------------   private void setCloseClick() {     //create window listener to respond to window close click     addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {         System.exit(0);       }     });   }   //------------------------------------------   private void setLF() {     // Force SwingApp to come up in the System L&F     String laf = UIManager.getSystemLookAndFeelClassName();     try {       UIManager.setLookAndFeel(laf);     } catch (UnsupportedLookAndFeelException exc) {       System.err.println("Warning: UnsupportedLookAndFeel: " + laf);     } catch (Exception exc) {       System.err.println("Error loading " + laf + ": " + exc);     }   }   //---------------------------------------------   static public void main(String argv[]) {     new productDisplay();   } } class InputFile {   RandomAccessFile f = null;   boolean errflag;   String s = null;   public InputFile(String fname) {     errflag = false;     try {       //open file       f = new RandomAccessFile(fname, "r");     } catch (IOException e) {       //print error if not found       System.out.println("no file found");       errflag = true; //and set flag     }   }   //-----------------------------------------   public boolean checkErr() {     return errflag;   }   //-----------------------------------------   public String read() {     //read a single field up to a comma or end of line     String ret = "";     if (s == null) //if no data in string     {       s = readLine(); //read next line     }     if (s != null) //if there is data     {       s.trim(); //trim off blanks       int i = s.indexOf(","); //find next comma       if (i <= 0) {         ret = s.trim(); //if no commas go to end of line         s = null; //and null out stored string       } else {         ret = s.substring(0, i).trim(); //return left of comma         s = s.substring(i + 1); //save right of comma       }     } else       ret = null;     return ret; //return string   }   //-----------------------------------------   public String readLine() {     //read in a line from the file     s = null;     try {       s = f.readLine(); //could throw error     } catch (IOException e) {       errflag = true;       System.out.println("File read error");     }     return s;   }   //-----------------------------------------   public void close() {     try {       f.close(); //close file     } catch (IOException e) {       System.out.println("File close error");       errflag = true;     }   }   //----------------------------------------- } class productList extends JawtList {   public productList(Vector products) {     super(products.size()); //for compatibility     for (int i = 0; i < products.size(); i++) {       //take each strig apart and keep only       //the product names, discarding the quntities       String s = (String) products.elementAt(i);       int index = s.indexOf("--"); //separate qty from name       if (index > 0)         add(s.substring(0, index));       else         add(s);     }   } } class productTable extends JScrollPane {   JTable table;   public productTable(Vector list) {     table = new JTable(new prodModel(list));     getViewport().add(table);   } } class prodModel implements TableModel {   int rows, columns;   Vector prodNames, quantities;   public prodModel(Vector products) {     rows = products.size();     columns = 2;     prodNames = new Vector();     quantities = new Vector();     for (int i = 0; i < products.size(); i++) {       String s = (String) products.elementAt(i);       int index = s.indexOf("--"); //separate qty from name       if (index > 0) {         prodNames.addElement(s.substring(0, index));         quantities.addElement(s.substring(index + 2).trim());       } else         prodNames.addElement(s);     }   }   public int getColumnCount() {     return columns;   }   public int getRowCount() {     return rows;   }   public Object getValueAt(int r, int c) {     switch (c) {     case 0:       return prodNames.elementAt(r);     case 1:       return quantities.elementAt(r);     default:       return prodNames.elementAt(r);     }   }   public Class getColumnClass(int c) {     return (new String("")).getClass();   }   public boolean isCellEditable(int r, int c) {     return false;   }   public String getColumnName(int c) {     return "";   }   public void setValueAt(Object obj, int r, int c) {   }   public void addTableModelListener(TableModelListener tbm) {   }   public void removeTableModelListener(TableModelListener tbm) {   } } //this is a simple adapter class to //convert List awt methods to Swing methods class JawtList extends JScrollPane implements ListSelectionListener, awtList {   private JList listWindow;   private JListData listContents;   //-----------------------------------------   public JawtList(int rows) {     listContents = new JListData();     listWindow = new JList(listContents);     listWindow.setPrototypeCellValue("Abcdefg Hijkmnop");     getViewport().add(listWindow);   }   //-----------------------------------------   public void add(String s) {     listContents.addElement(s);   }   //-----------------------------------------   public void remove(String s) {     listContents.removeElement(s);   }   //-----------------------------------------   public String[] getSelectedItems() {     Object[] obj = listWindow.getSelectedValues();     String[] s = new String[obj.length];     for (int i = 0; i < obj.length; i++)       s[i] = obj[i].toString();     return s;   }   //-----------------------------------------   public void valueChanged(ListSelectionEvent e) {   } } //  ========================================= class JListData extends AbstractListModel {   private Vector data;   //-----------------------------------------   public JListData() {     data = new Vector();   }   //-----------------------------------------   public int getSize() {     return data.size();   }   //-----------------------------------------   public Object getElementAt(int index) {     return data.elementAt(index);   }   //-----------------------------------------   public void addElement(String s) {     data.addElement(s);     fireIntervalAdded(this, data.size() - 1, data.size());   }   //-----------------------------------------   public void removeElement(String s) {     data.removeElement(s);     fireIntervalRemoved(this, 0, data.size());   } } interface awtList {   public void add(String s);   public void remove(String s);   public String[] getSelectedItems(); } //products.txt /* Brass plated widgets --1,000,076 Furled frammis       --75,000 Detailed rat brushes --700 Zero-based hex dumps--80,000 Anterior antelope collars --578 Washable softwear --789,000 Steel-toed wing-tips --456,666 */