algorithm programming 1 java gui with swing
Post on 05-Jan-2016
60 Views
Preview:
DESCRIPTION
TRANSCRIPT
Algorithm Programming 1 JAVA GUI with SwingBar-Ilan University
תשס"ז 2006-2007
Moshe Fresko
AWT AWT : Abstract Windowing Toolkit. Tools for
developing Platform Independent GUI. AWT rely on native C code to create User Interface
components. Java 1.0 AWT : Very restrictive. Java 1.1 AWT : Event Model, more OO approach Java 2 (JDK 1.2) – Everything replaced by JFC
(Java Foundation Classes). Swing: GUI part of JFC.
Swing Swing is a powerful collection of UI
components. Multiple look and feel support Customizable look and feel Lightweight UI framework Swing components are written in pure Java
(uses AWT components which use native C codes) MVC (Model View Controller) style component
designs
Some Swing libraries javax.swing.* : Includes swing GUI components and
supporting classes. javax.swing.border.* : Classes that defines borders to
decorate GUI components. javax.swing.event.* : Event handling classes, including new
event and listener classes javax.swing.plaf.* : Definitions of UI objects for the Swing
components javax.swing.table.* : Supporting classes for the Table
component javax.swing.text.* : The swing styled text framework javax.swing.tree.* : Supporting classes for the Tree
component
JComponent Most of the Swing components are subclasses of JComponent. JComponent is the root of “COMPOSITE” pattern. JComponent is a “Container” which has .add(Component) method.
java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
JButton JPanel JLabel JComboBox
Example Windowimport javax.swing.* ;import java.awt.event.* ;import java.awt.* ;
public class SimpleWindow {public static void main(String s[]) {
JFrame frame = new JFrame("Simple Window") ;JButton button = new JButton("Hello Button") ;JLabel label = new JLabel("A Label") ;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;frame.getContentPane().add(button,"Center") ;frame.getContentPane().add(label,"South") ;frame.pack() ;frame.setVisible(true) ;
}}
JComponent features JComponent defines some standard features for
Swing components Borders Component-specified min.,max., and preferred sizes Tool tips Slow-motion rendering for Debugging Auto-scrolling Double buffering Keystroke handling Support for accesibility Actions Icons
JComponent features Example:
public void setBorder(Border aBorder) public Dimension getMinimumSize()
public Dimension getMaximumSize()public Dimension getPreferredSize()
public void setToolTipText(String txt) public void setAutoscrolls(boolean yesNo) public void registerKeyboardAction(ActionListener
anAction, KeyStroke aKeyStroke, int aCondition) etc.
Pattern: “Composite” Compose objects into tree structures to
represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.
Example: Graphical components. Containers can have many Simple components and other Containers.
From Client Side: No distinction between Simple Components to Containers.
COMPOSITE – Graphic Example
COMPOSITE – General Structure
COMPOSITE – Example object
Event Handling Delegation event model.
Event types Event processors Event listeners
Event
Event Processor / Component
Event Listener
Notifies Registers
Event Types Event Types
ActionEvent : Like Button clicked or the return key is pressed.
ChangeEvent : A value has changed. FocusEvent : Component gains or looses focus. ItemEvent : Selection of an item changed. KeyEvent : Key press or release ListDataEvent : Contents of a list change ListSelectionEvent : Selection in list changes MenuEvent : When a menu is selected or cancelled MouseEvent : WindowEvent : Window closing, iconifying, etc.
Event Listeners Customized programs for reacting to events.
Like : What to do when a button is clicked. One Event Processor can have more then one event
listener.Like : There can be a couple of Listeners for a button click.
Components that react to events must implement the appropriate interface.Like : In Button-click, the reacting object must be an implementation of ActionListener
There are adaptors for making Concrete empty implementation of Listeners.
Events in Swing If we have an event called EEE Event addition-removal functions are located mostly in
JComponent typesaddEEEListener(EEEListener listener)removeEEEListener(EEEListener listener)
The Listener interface type is interface EEEListener
The Abstract class of that interface (if there is one) isabstract class EEEAdapter
The Event get is in the object of class EEEEvent
Events in swing Event Class = ActionEvent
Listener Interface = ActionListenerFunctions = addActionListener(…)
removeActionListener(…)No Adapter.Who : JButton, JList, JTextField, JMenuItem, etc.
Event Class = AdjustmentEventListener Interface = AdjustmentListenerFunctions = addAdjustmentListener(…)
removeAdjustmentListener(…)No Adapter.Who : JScrollbar
Event Class = WindowEventListener Interface = WindowListenerFunctions = addWindowListener(…)
removeWindowListener(…)No Adapter.Who : JFrame, JDialog, JFileDialog, etc.
Many more: ComponentEvent, ContainerEvent, FocusEvent, KeyEvent, MouseEvent, ItemEvent, TextEvent, etc.
Example: Window with Event Handlerimport java.util.* ;import java.awt.* ;import java.awt.event.* ;import javax.swing.* ;class WindowCloser extends WindowAdapter // Indirectly implements WindowListener{ int i = 0 ; public void windowClosing(WindowEvent e)
{ Window win ; i++ ; if (i>=3) { win = e.getWindow() ; win.setVisible(false) ; win.dispose() ; System.exit(0) ; } } }
public class Windows extends JFrame {
public static void main(String[] args) {
JFrame win = new Windows() ;
win.addWindowListener(new WindowCloser()) ;
win.getContentPane().add(new Label("Hello"),"Center") ;
win.pack() ;
win.setVisible(true) ;
}
}
Example: Button with Action Event
package GUI;import java.awt.* ;import java.awt.event.* ;import javax.swing.* ;
public class HelloGoodbye extends JFrame implements ActionListener {
private static final String HELLO="Hello!" ; private static final String GOODBYE="GoodBye!" ; private String message = HELLO ; private JPanel counterPanel ; private JButton counterButton ; private JLabel counterLabel ; public HelloGoodbye() { super("HelloGoodbye") ; counterLabel = new
JLabel(message,SwingConstants.CENTER) ; counterButton = new
JButton("Click Me") ; counterButton.addActionListener(this) ; counterPanel = new JPanel() ; counterPanel.setBorder(
BorderFactory. createEmptyBorder(20,60,20,60)) ;
counterPanel.setLayout(new BorderLayout()) ; counterPanel.add(
counterLabel,BorderLayout.CENTER) ; counterPanel.add(
counterButton,BorderLayout.SOUTH) ; getContentPane().add(counterPanel) ; addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0) ; } } ) ; pack() ; setVisible(true) ; } public void actionPerformed(ActionEvent e) { if (message.equals(HELLO)) { message = GOODBYE ; } else { message = HELLO ; } counterLabel.setText(message) ; } public static void main(String[] args) { final HelloGoodbye app = new HelloGoodbye() ; }}
Event Queue
A. Event OccursB. Event Object CreatedC. Add Event to Queue
Event
Event Queue
Notifiy Processor / Component
Get Next Event
Determine Event Processor
Layout Managers Layout managers define how to lay out the
child components in a container. Each container type has a default Layout
manager. It can be replaced with an existing layout
manager or a custom one can be created.
Layout Managers Some layout Managers in AWT and Swing
BorderLayout BoxLayout CardLayout FlowLayout GridBagLayout GridLayout OverlayLayout ScrollpaneLayout ViewportLayout
Some containers have default layout managers JPanel : FlowLayout JScrollPane : ScrollPaneLayout JViewport : ViewportLayout etc.
Border Layout Exampleimport javax.swing.*;import java.awt.*;
public class BorderLayoutExample { public static void main(String[] args) {
JFrame f = new JFrame("Border Layout Example") ; Container c = f.getContentPane() ; c.setLayout(new BorderLayout()) ; // Default
c.add(BorderLayout.NORTH, new JButton("North")); c.add(BorderLayout.SOUTH, new JButton("South"));
c.add(BorderLayout.EAST, new JButton("East")); c.add(BorderLayout.WEST, new JButton("West")); c.add(BorderLayout.CENTER, new JButton("Center")); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ; f.pack() ; f.setVisible(true) ;
}}
Flow Layout Exampleimport javax.swing.*;import java.awt.*;
public class FlowLayoutExample { public static void main(String[] args) {
JFrame f = new JFrame("Flow Layout Example") ; Container c = f.getContentPane() ; c.setLayout(new FlowLayout()) ;
c.add(new JButton("North")); c.add(new JButton("South"));
c.add(new JButton("East")); c.add(new JButton("West")); c.add(new JButton("Center")); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ; f.pack() ; f.setVisible(true) ;
}}
MVC–Model View ControllerObserver pattern
MVC MVC : (Model View Controller) is used in building
User Interfaces. MVC consists of three kinds of objects
Model : Is the application object, or data. View : Its screen presentation Control : Controls how User interface reacts with the data.
MVC uses subscribe/notify protocol. Decoupling between Model and View, allows to
attach Multiple Views to a Model.
MVC
Example - Swing Swing components has Model-View-
Controller type of organization. For example :
JProgressBar uses BoundedRangeModel. public BoundedRangeModel getModel() ; public void setModel(BoundedRangeModel newModel)
;
JSlider as well uses BoundedRangeModel.
Example – BoundedRangeModel
import java.util.* ;import java.awt.* ;import java.awt.event.* ;import javax.swing.* ;public class ProgressModel extends JPanel { public ProgressModel() { JProgressBar progBar = new JProgressBar() ; progBar.setMinimum(0) ; progBar.setMaximum(100) ; progBar.setValue(0) ; JSlider slider = new JSlider() ; slider.setModel(progBar.getModel()) ; add(progBar) ; add(slider) ; } public Dimension getPreferredSize() { return new Dimension(300,100) ; }
public static void main(String[] args) {
JFrame f = new JFrame("Progress Model Example") ;
ProgressModel panel = new ProgressModel() ;
f.setForeground (Color.black) ;
f.setBackground (Color.lightGray) ;
f.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE ) ;
f.getContentPane().add ( BorderLayout.CENTER,panel) ;
f.setSize(panel.getPreferredSize()) ;
f.show() ;
}
}
“OBSERVER”
“OBSERVER” Pattern Define a one-to-many dependency between objects so
that when one object changes state, all its dependents are notified and updated automatically.
The key objects are “subject” and “observer”. A “subject” can have many dependent “observer”s Whenever “suject” undergoes a change all “observer”s are
notified Each “observer” can query “subject” for synchronizing its
state “Publish”-“Subscribe” : “observer”s are subscribed to
“subject” and “subject” publishes or notifies the observers of any change.
OBSERVER
OBSERVER Participants
“Subject” Knows its observers. Methods for adding and removing “Observer”s
“Observer” Method for being updated
ConcreteSubject Stores state of interest Sends notification to “Observer”s when its state change
ConcreteObserver Has a reference to ConcreteSubject Its state must be consistent with subject’s state Implements Updating to keep its state consistent with subject’s state
OBSERVER
OBSERVER Who calls notify() or update() …
If Subject calls … Client Observers don’t have to remember to call every time there is a
change in Subject If Observers call
An Observer can make a list of changes and only then call the notify() Update() can pass as argument the change.
Push model : Subject sends observers detailed information about the change, whether they want it or not.
Pull model : Subject sends only a minimal notification, and observers ask for details.
Observers can specify interest on some changes when they subscribe.
Complex Swing ComponentsJTable, JTree, etc.
JTree A tree is a set of hierarchical nodes. The top of this hierarchy is called “root”. An element that does not have children is
called “leaf”. JTree nodes are managed by a “TreeModel”. “TreeCellRenderer” converts an object to its
visual representation in the tree.
JTree Example
TreeModel Methods Object getRoot() Object getChild(Object parent, int index) int getChildCount(Object parent) boolean isLeaf(Object node) void valueForPathChanged(TreePath path, Object newVal) int getIndexOfChild(Object parent, Object child) void addTreeModelListener(TreeModelListener l) void removeTreeModelListener(TreeModelListener l)
JTree constructors JTree() JTree(Object[] value) JTree(Vector value) JTree(Hashtable value) JTree(TreeNode root) JTree(TreeNode root, boolean
asksAllowsChildren) JTree(TreeModel newModel)
TreeNodes Default tree model uses objects of TreeNode to represent the nodes in the
tree. A default implementation of it is DefaultMutableTreeNode. TreeNode methods
TreeNode getChildAt(int childIndex) int getChildCount() TreeNode getParent() int getIndex(TreeNode node) boolean getAllowsChildren() boolean isLeaf() Enumeration children()
DefaultMutableTreeNode constructors DefaultMutableTreeNode() DefaultMutableTreeNode(Object userObject) DefaultMutableTreeNode(Object userObject, boolean allowsChildren)
JTree example
import javax.swing.* ;import javax.swing.tree.* ;import java.awt.event.* ;import java.awt.* ;import java.util.* ;public class TreeNodeExample extends JPanel {
public TreeNodeExample() {DefaultMutableTreeNode rootNode = new
DefaultMutableTreeNode("Categories") ;DefaultMutableTreeNode parentNode = new
DefaultMutableTreeNode("Metals") ;parentNode.add(new DefaultMutableTreeNode("Gold",false)) ;parentNode.add(new DefaultMutableTreeNode("Silver",false)) ;parentNode.add(new DefaultMutableTreeNode("Bronze",false)) ;parentNode.add(new DefaultMutableTreeNode("Copper",false)) ;parentNode.add(new DefaultMutableTreeNode("Iron",false)) ;parentNode.add(new DefaultMutableTreeNode("Platinium",false)) ;parentNode.add(new DefaultMutableTreeNode("Titanium",false)) ;rootNode.add(parentNode) ;parentNode = new DefaultMutableTreeNode("Companies") ;parentNode.add(new DefaultMutableTreeNode("Paradigm
Research",false)) ;parentNode.add(new DefaultMutableTreeNode("JavaSoft",false)) ;parentNode.add(new DefaultMutableTreeNode("Wiley Press",false)) ;rootNode.add(parentNode) ;setLayout(new BorderLayout());add(new JScrollPane(new JTree(rootNode)),"Center") ;
}
public Dimension getPreferredSize(){ return new Dimension(200,120) ; }
public static void main(String[]args) {JFrame frame = new JFrame("Tree Node Example") ;TreeNodeExample panel = new TreeNodeExample() ;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;frame.getContentPane().add(panel,"Center") ;frame.setSize(panel.getPreferredSize()) ;frame.setVisible(true) ;
} }
TreeModel Listener TreeModelListener methods
void treeNodesChanged(TreeModelEvent e) void treeNodesInserted(TreeModelEvent e) void treeNodesRemoved(TreeModelEvent e) void treeStructureChanged(TreeModelEvent e)
TreeModelEvent methods TreePath getTreePath() Object[] getPath() Object[] getChildren() int[] getChildIndices()
Custom Tree Model Example
import java.io.* ;
import java.util.* ;
class FileHolder {
File myFile ;
Vector children ;
public FileHolder(File f)
{ myFile = f ; }
public File getFile()
{ return myFile ; } public String toString() { return myFile.getName() ; }
public Vector getChildren() { if (myFile.isDirectory() && (children==null)) { int max=0; String list[] ; File curFile ; FileHolder curHolder ; children = new Vector() ; list = myFile.list() ; if (list!=null) max = list.length ; for (int i=0;i<max;++i) { curFile = new File(myFile,list[i]) ; curHolder = new FileHolder(curFile) ; children.addElement(curHolder) ; } } return children ; }}
Custom Tree Model Exampleimport javax.swing.* ;import javax.swing.tree.* ;import javax.swing.event.* ;import java.io.* ;import java.util.* ;class FileSystemTreeModel implements TreeModel { protected FileHolder root ; protected Vector listeners ; public FileSystemTreeModel(File r) { root = new FileHolder(r) ; listeners = new Vector() ; } public Object getRoot() { return root ; } public Object getChild(Object parent, int index) { Object retVal=null ; Vector children ; if (parent instanceof FileHolder) { children = ((FileHolder)parent).getChildren() ; if (children!=null) if (index<children.size()) retVal=children.elementAt(index) ; } return retVal ; } public int getChildCount(Object parent) { int retVal = 0 ; Vector children ; if (parent instanceof FileHolder) { children = ((FileHolder)parent).getChildren() ; if (children!=null) retVal = children.size() ; } return retVal ; }
public boolean isLeaf(Object node)
{ boolean retVal = true ;
File file ;
if (node instanceof FileHolder) {
file = ((FileHolder)node).getFile() ;
retVal = file.isFile() ;
}
return retVal ; }
public void valueForPathChanged(TreePath path, Object newVal)
{ }
public int getIndexOfChild(Object parent, Object child)
{ int retVal = -1 ;
Vector children ;
if (parent instanceof FileHolder) {
children = ((FileHolder)parent).getChildren() ;
if (children!=null)
retVal = children.indexOf(child) ;
}
return retVal ; }
public void addTreeModelListener(TreeModelListener l)
{ if ((l!=null)&&!listeners.contains(l))
listeners.addElement(l) ; }
public void removeTreeModelListener(TreeModelListener l)
{ listeners.removeElement(l) ; }
}
Custom Tree Model Exampleimport javax.swing.* ;import java.awt.event.* ;import java.awt.* ;import java.io.* ;import java.util.* ;public class FileTree extends JPanel { public FileTree(String startPath) { JTree tree = new JTree() ; tree.setModel(new FileSystemTreeModel(new File(startPath))) ; setLayout(new BorderLayout()) ; add(new JScrollPane(tree),"Center") ; } public Dimension getPreferredSize() { return new Dimension(250,200) ; } public static void main(String[]s) { JFrame frame = new JFrame("File Tree Example") ; FileTree panel = new FileTree(s.length>0?s[0]:"/") ; frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ; frame.getContentPane().add(panel,"Center") ; frame.setSize(panel.getPreferredSize()) ; frame.setVisible(true) ; }}
JTable JTable displays tabular data in rows and
columns. Header for the title of each column.
TableModel
TableModel Methods void addTableModelListener(TableModelListener l) void removeTableModelListener(TableModelListener l) int getRowCount() int getColumnCount() String getColumnName(int columnIndex) Class getColumnClass(int columnIndex) boolean isCellEditable(int rowIndex, int columnIndex) Object getValueAt(int rowIndex, int columnIndex) Object setValueAt(Object aValue, int rowIndex, int columnIndex)
AbstractTableModel (methods that must be implemented) int getRowCount() int getColumnCount() Object getValueAt(int rowIndex,int columnIndex)
TableModelListener TableModelListener methods
void tableChanged(TableModelEvent evt) TableModelEvent methods
int getColumn() int getFirstRow() int getLastRow() int getType()
top related