Copyright 2003 Mudra Services1 SWING - JTabbedPane Helps stack pages of information into a single point of reference If information cannot be laid out in one page, it can be split into multiple tabs Not available in AWT But somewhat similar to CardLayout A lot of text editors use it to show open files. Can work with multiple files simultaneously.
Copyright 2003 Mudra Services2 SWING - JTabbedPane Clicking on Name tab
Copyright 2003 Mudra Services3 SWING - JTabbedPane Clicking on Address tab
Copyright 2003 Mudra Services4 SWING - JTabbedPane Clicking on Other tab
Copyright 2003 Mudra Services5 SWING - JTabbedPane package tabbedexample; import java.awt.*; import javax.swing.*; public class TabbedExample extends JFrame { public TabbedExample() { // creation of the tabbed pane object JTabbedPane pane = new JTabbedPane(); // create the 3 panels JPanel panel1 = createPanel1(); JPanel panel2 = createPanel2(); JPanel panel3 = createPanel3();
Copyright 2003 Mudra Services6 SWING - JTabbedPane // add the panels to the pane pane.addTab("Name",panel1); pane.addTab("Address",panel2); pane.addTab("Other",panel3); pane.setSelectedComponent(panel1); // create button panel JPanel buttons = new JPanel(); buttons.setLayout(new FlowLayout(FlowLayout.RIGHT,5,5)); buttons.add(new JButton("Submit")); // add the panel to top panel getContentPane().add(pane,BorderLayout.CENTER); getContentPane().add(buttons,BorderLayout.SOUTH); }
Copyright 2003 Mudra Services7 SWING - JTabbedPane // create panel 1 private JPanel createPanel1() { JPanel panel = new JPanel(); panel.setLayout(new FlowLayout(FlowLayout.CENTER)); panel.setBorder(BorderFactory.createEtchedBorder()); panel.add(new JLabel("Name: ")); panel.add(new JTextField(30)); return(panel); }
Copyright 2003 Mudra Services8 SWING - JTabbedPane // create panel 2 private JPanel createPanel2() { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.setBorder(BorderFactory.createEtchedBorder()); panel.add("Center",new JTextArea()); return(panel); }
Copyright 2003 Mudra Services9 SWING - JTabbedPane // create panel 3 private JPanel createPanel3() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS)); panel.setBorder(BorderFactory.createEtchedBorder()); panel.add(new JCheckBox("Check if you are still in school")); panel.add(new JCheckBox("Check if you have no medical problems")); return(panel); }
Copyright 2003 Mudra Services10 SWING - JTabbedPane // create main program public static void main(String[] args) { TabbedExample tabbedExample = new TabbedExample(); tabbedExample.pack(); tabbedExample.setVisible(true); }
Copyright 2003 Mudra Services11 SWING - JTabbedPane Remove Tabs pane.removeTabAt(index) Selecting pages pane.setSelectedIndex(index) Adding images to tabs pane.addTab(“text”,icon,panel) Enabling/Disabling tab pane.setEnabledAt(2,false) Page selection changes can be detected by listening to ChangeEvents generated
Copyright 2003 Mudra Services12 SWING - JScrollPane Used when a panel is too big to be displayed on the screen A typical example is a text editor where only a part of the text is displayed at a time. Scrollbars are used to scroll the text. The developer is responsible for only populating the pane. SWING manages all the repainting, resizing activities associated with the pane
Copyright 2003 Mudra Services13 SWING - JScrollPane An image being scrolled
Copyright 2003 Mudra Services14 SWING - JScrollPane package scrollexample; import java.awt.*; import javax.swing.*; public class ScrollExample extends JFrame { public ScrollExample() { // set the size of the frame setSize(600,400); // create a JLabel component Icon image = new ImageIcon("cliff_ib.gif"); JLabel label = new JLabel(image);
Copyright 2003 Mudra Services15 SWING - JScrollPane // add the jlabel to the scroll pane JScrollPane pane = new JScrollPane(); pane.getViewport().add(label); // add the scroll pane to the frame getContentPane().add("Center",pane); } public static void main(String[] args) { ScrollExample scrollExample = new ScrollExample(); scrollExample.setVisible(true); }
Copyright 2003 Mudra Services16 SWING - JScrollPane Control scroll bars pane.setVerticalScrollBarPolicy( ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); pane.setHorizontalScrollBarPolicy( ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); Control the size of scroll bars // changing the size of the scroll bars JScrollBar vBar = pane.getVerticalScrollBar(); Dimension dim = vBar.getSize(); dim.width = 5; vBar.setPreferredSize(dim);
Copyright 2003 Mudra Services17 SWING - JScrollPane Unit Increment Block Increment The increment size can be changed from the default by using the Scrollable interface. Scrollable interface Dimension getPreferredScrollableViewportSize() int getScrollableBlockIncrement() int getScrollableUnitIncrement() boolean getScrollableTracksViewportWidth() boolean getScrollableTracksViewportHeight()
Copyright 2003 Mudra Services18 SWING - JScrollPane class ScrollableImage extends JLabel implements Scrollable { public ScrollableImage(Icon icon) { super(icon); } public Dimension getPreferredScrollableViewportSize() { return(new Dimension(300,300)); } public int getScrollableBlockIncrement(Rectangle visibleRect,int orientation,int direction) { return(20); }
Copyright 2003 Mudra Services19 SWING - JScrollPane public int getScrollableUnitIncrement(Rectangle visibleRect,int orientation,int direction) { return(20); } public boolean getScrollableTracksViewportWidth() { return(false); } public boolean getScrollableTracksViewportHeight() { return(false); }
Copyright 2003 Mudra Services20 SWING - JSplitPane View two or more pieces of information simultaneously Resize any panel to view more or less data Orientation left-to-right top-to-bottom Text editors usually have split windows to create multiple copies of the same text file. This allows you to look at different parts of the text document at the same time.
Copyright 2003 Mudra Services21 SWING - JSplitPane A window split into two panels Vertical Split
Copyright 2003 Mudra Services22 SWING - JSplitPane package splitexample; import java.awt.*; import javax.swing.*; public class SplitExample extends JFrame { public SplitExample() { // create a split pane JSplitPane splitpane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); // create the panels JPanel panel1 = createPanel1(); JPanel panel2 = createPanel2();
Copyright 2003 Mudra Services23 SWING - JSplitPane // add to the split pane splitpane.setTopComponent(panel1); splitpane.setBottomComponent(panel2); // add splitpane to the frame getContentPane().add(splitpane); } public static void main(String[] args) { SplitExample splitExample = new SplitExample(); splitExample.pack(); splitExample.setVisible(true); }
Copyright 2003 Mudra Services24 SWING - JSplitPane // create panel 1 private JPanel createPanel1() { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.setBorder(BorderFactory.createEtchedBorder()); panel.add("Center",new JTextArea(5,30)); return(panel); }
Copyright 2003 Mudra Services25 SWING - JSplitPane // create panel 2 private JPanel createPanel2() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS)); panel.setBorder(BorderFactory.createEtchedBorder()); panel.add(new JCheckBox("Check if you are still in school")); panel.add(new JCheckBox("Check if you have no medical problems")); return(panel); } } // end
Copyright 2003 Mudra Services26 SWING - JSplitPane One split pane can be nested into another split pane for a more complex interface Setting the divider size splitpane.setDividerSize(20) A divider movement can be detected by using the AncestorListener Components of the split pane can implement it
Copyright 2003 Mudra Services27 SWING - JEditorPane Extends from the JTextComponent class Ability to display any mime type Can easily create an HTML viewer for online help Add internet capability to the application
Copyright 2003 Mudra Services28 SWING - JEditorPane package editorpaneexample; import java.awt.*; import javax.swing.*; import javax.swing.event.*; import java.net.*; public class EditorPaneExample extends JFrame implements HyperlinkListener { private JEditorPane editorpane; public EditorPaneExample() { try { setSize(600,600);
Copyright 2003 Mudra Services29 SWING - JEditorPane // create an editor pane pointing to a URL URL url = new URL("file:///D:/OLDui/index.html"); editorpane = new JEditorPane(url); editorpane.setEditable(false); editorpane.addHyperlinkListener(this); // wrap the editor pane in a scroll pane JScrollPane scrollpane = new JScrollPane(); scrollpane.getViewport().add(editorpane,BorderLayout.CENTER); // add the pane to the frame getContentPane().add(scrollpane,BorderLayout.CENTER); } catch (Exception exp) { System.out.println(exp.getMessage()); } }
Copyright 2003 Mudra Services30 SWING - JEditorPane public void hyperlinkUpdate(HyperlinkEvent event) { if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { // User clicked on a URL try { editorpane.setPage(event.getURL()); } catch (Exception exp) { System.out.println("Error :: " + exp.getMessage()); }
Copyright 2003 Mudra Services31 SWING - JEditorPane public static void main(String[] args) { EditorPaneExample editorPaneExample = new EditorPaneExample(); editorPaneExample.setVisible(true); } Swing handles RTF other than HTML Custom formats can be handled by setting up custom editor kits
Copyright 2003 Mudra Services32 SWING - Action Synchronizing the action listeners for toolbars buttons, menu items and popup menu items is a nightmare Synchronizing enabling/disabling is a problem Actions are the solution to avoid synchronization and foster code reuse An action object can be added to a toolbar, menu or a popup menu Action object can be disabled/enabled
Copyright 2003 Mudra Services33 SWING - Action Action class should extend from AbstractAction public class XAction extends AbstractAction { public XAction(String name,ImageIcon image) { super(name,image); } public void actionPerformed(ActionEvent event) { // Handle action event for X here }
Copyright 2003 Mudra Services34 SWING - Action Shows the disabled actions
Copyright 2003 Mudra Services35 SWING - Action package actionexample; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class ActionExample extends JFrame { private JPopupMenu popup = new JPopupMenu(); // Handle right clicks public class MouseHandler extends MouseAdapter { public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { popup.show(e.getComponent(),e.getX(),e.getY()); }
Copyright 2003 Mudra Services36 SWING - Action // Action class for 'New' class NewAction extends AbstractAction { NewAction(String name,ImageIcon icon) { super(name,icon); } public void actionPerformed(ActionEvent e) { // handle new action }
Copyright 2003 Mudra Services37 SWING - Action // Action class for 'Save' class SaveAction extends AbstractAction { SaveAction(String name,ImageIcon icon) { super(name,icon); } public void actionPerformed(ActionEvent e) { // handle save action }
Copyright 2003 Mudra Services38 SWING - Action // Action class for 'SaveAll' class SaveAllAction extends AbstractAction { SaveAllAction(String name,ImageIcon icon) { super(name,icon); } public void actionPerformed(ActionEvent e) { // handle saveAll action }
Copyright 2003 Mudra Services39 SWING - Action public ActionExample() { setSize(300,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Action newAction = new NewAction("Open",new ImageIcon("open.gif")); Action saveAction = new SaveAction("Save",new ImageIcon("save.gif")); Action saveallAction = new SaveAllAction("Save All",new ImageIcon("saveall.gif")); // create a menu bar and file menu JMenuBar menubar = new JMenuBar(); JMenu fileMenu = new JMenu("File");
Copyright 2003 Mudra Services40 SWING - Action fileMenu.add(newAction); fileMenu.add(saveAction); fileMenu.add(saveallAction); menubar.add(fileMenu); setJMenuBar(menubar); // create a tool bar JToolBar tool = new JToolBar(); tool.add(newAction); tool.add(saveAction); tool.add(saveallAction); getContentPane().add("North",tool); Add actions to Menu bar Add actions to Tool bar
Copyright 2003 Mudra Services41 SWING - Action // add to popup menu popup.add(newAction); popup.add(saveAction); popup.add(saveallAction); // disable saveall action and save action saveAction.setEnabled(false); saveallAction.setEnabled(false); getContentPane().add("Center",new JPanel()); getContentPane().addMouseListener(new MouseHandler()); } Add actions to Popup menu item
Copyright 2003 Mudra Services42 SWING - Action public static void main(String[] args) { ActionExample actionExample = new ActionExample(); // pack and show actionExample.setVisible(true); }
Copyright 2003 Mudra Services43 SWING - JDialog Secondary application window Almost like a JFrame But supports modal operation. Extends from the Dialog class in AWT
Copyright 2003 Mudra Services44 SWING - JDialog A JDialog window
Copyright 2003 Mudra Services45 SWING - JDialog package dialogexample; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class DialogExample extends JFrame implements ActionListener { public DialogExample() { // exit the frame on close this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // create a JButton and add it to the content pane JButton jbutton = new JButton("Open Dialog"); jbutton.addActionListener(this); getContentPane().add(jbutton); }
Copyright 2003 Mudra Services46 SWING - JDialog public void actionPerformed(ActionEvent e) { // when the button is clicked, control comes here TestDialog dialog = new TestDialog(this,"Test Dialog",true); dialog.pack(); dialog.setVisible(true); } public static void main(String[] args) { DialogExample dialogExample = new DialogExample(); dialogExample.pack(); dialogExample.setVisible(true); }
Copyright 2003 Mudra Services47 SWING - JDialog package dialogexample; import java.awt.*; import javax.swing.*; public class TestDialog extends JDialog { public TestDialog(Frame frame, String title, boolean modal) { super(frame, title, modal); // dispose the dialog on close this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); // create a button panel JPanel buttons = new JPanel();
Copyright 2003 Mudra Services48 SWING - JDialog buttons.setLayout(new FlowLayout(FlowLayout.RIGHT,5,5)); buttons.add(new JButton("Close")); // add the buttons JPanel areaPanel = new JPanel(); JTextArea area = new JTextArea(5,40); areaPanel.add(area); areaPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEtchedBorder(), BorderFactory.createEmptyBorder(5,5,5,5))); getContentPane().add("Center",areaPanel); getContentPane().add("South",buttons); }
Copyright 2003 Mudra Services49 SWING - JOptionPane Simplifies the task of displaying quick information to the user Messages can be in the form of Error Message Information message Warning message Question message Plain message Can show confirm dialog
Copyright 2003 Mudra Services50 SWING - JOptionPane JOptionPane option = new JOptionPane(); option.showMessageDialog(this,"This is an Error","Error",JOptionPane.ERROR_MESSAGE);
Copyright 2003 Mudra Services51 SWING - JOptionPane JOptionPane option = new JOptionPane(); option.showMessageDialog(this,"This is an Warning","Warning",JOptionPane.WARNING_MESSAGE);
Copyright 2003 Mudra Services52 SWING - JOptionPane JOptionPane option = new JOptionPane(); int uoption = option.showConfirmDialog(this,"Is this a Question?","Question",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,null); if (uoption == JOptionPane.YES_OPTION) { …………….}
Copyright 2003 Mudra Services53 SWING - JColorChooser Platform independent way of choosing color Simplifies the user interface for color selection Can be Used as an independent dialog for choosing a color Embedded in a frame which contains other panel
Copyright 2003 Mudra Services54 SWING - JColorChooser Color color = JColorChooser.showDialog(this,"Choose a Color",Color.blue); // Act on the color chosen by the user
Copyright 2003 Mudra Services55 SWING - JFileChooser Platform independent way of providing a file selection mechanism Allows filtering of files JFileChooser chooser = new JFileChooser(); int value = chooser.showOpenDialog(this); if (value == JFileChooser.APPROVE_OPTION) { File file = chooser.getSelectedFile(); // handle file selection }
Copyright 2003 Mudra Services56 SWING - JFileChooser A file chooser
Copyright 2003 Mudra Services57 SWING - JInternalFrame Allows the capability to embed frames within frames The internal frames can move within the bounds of the parent frame Can be maximized,minimized or restored Also called the MDI (multiple document interface)
Copyright 2003 Mudra Services58 SWING - JInternalFrame
Copyright 2003 Mudra Services59 SWING - JInternalFrame package internalexample; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class InternalExample extends JFrame implements ActionListener { private JDesktopPane deskPane; public InternalExample() { setSize(500,500); // create a tool bar JToolBar toolbar = new JToolBar(); JButton newButton = new JButton("Create"); newButton.addActionListener(this); toolbar.add(newButton);
Copyright 2003 Mudra Services60 SWING - JInternalFrame // create a desktop pane deskPane = new JDesktopPane(); getContentPane().add("Center",deskPane); getContentPane().add("North",toolbar); } public void actionPerformed(ActionEvent e) { TestInternalFrame frame = new TestInternalFrame(); frame.setVisible(true); deskPane.add(frame); }
Copyright 2003 Mudra Services61 SWING - JInternalFrame public static void main(String[] args) { InternalExample internalExample = new InternalExample(); internalExample.setVisible(true); } } // end Internal Example
Copyright 2003 Mudra Services62 SWING - JInternalFrame package internalexample; import java.awt.*; import javax.swing.*; public class TestInternalFrame extends JInternalFrame { public TestInternalFrame() { super("Internal Frame"); // set the frame properties setClosable(true); setMaximizable(true); setIconifiable(true); setResizable(true);
Copyright 2003 Mudra Services63 SWING - JInternalFrame // set the size and add test area setSize(400,400); getContentPane().add("Center",new JTextArea()); } } // end TestInternalFrame Other methods moveToFront() moveToBack() setMenuBar(JMenuBar menubar) addInternalFrameListener(InternalFrameListener listener)
Copyright 2003 Mudra Services64 SWING – Exercise 3
Copyright 2003 Mudra Services65 SWING – Exercise Create a UI layout as shown in the previous page. When the frame is first shown the label at the bottom should say “File not selected”. When the user clicks on button and chooses a file or directory, the label text should change to the full absolute path of the file. When the window is closed, the application should exit.
Copyright 2003 Mudra Services66 SWING - JList Collection of items from which user can make one or more selection Has the ability to provide graphics inside the list
Copyright 2003 Mudra Services67 SWING - JList Jlist accepts String[], Vector or ListModel String[] items = new String[] { "item1","item2","item3","item4","item5","item6","item7","item8","item9","item10" }; JList list = new JList(items); list.setVisibleRowCount(5); getContentPane().add("Center",new JScrollPane(list));
Copyright 2003 Mudra Services68 SWING - JList // A Custom List Model class TestModel extends AbstractListModel { public int getSize() { return(10); } public Object getElementAt(int index) { return "item" + index; }
Copyright 2003 Mudra Services69 SWING - JList
Copyright 2003 Mudra Services70 SWING - JList package listexample; import java.awt.*; import javax.swing.*; public class ListExample extends JFrame { private String[] items = {"Open","Save","SaveAll","Zoom","Zoomin","Zoomout"}; private String[] images = {"open.gif","save.gif","saveall.gif","zoom.gif","zoomin.gif","zoomout.gif"};
Copyright 2003 Mudra Services71 SWING - JList // Custom model class TestModel extends AbstractListModel { public int getSize() { return(items.length); } public Object getElementAt(int index) { return(items[index]); } } // end TestModel
Copyright 2003 Mudra Services72 SWING - JList // Custom cell renderer class CustomCellRenderer extends JLabel implements ListCellRenderer { public CustomCellRenderer() { setOpaque(true); } public Component getListCellRendererComponent(JList list,Object value,int index,boolean isSelected,boolean cellHasFocus) { this.setText(value.toString()); this.setIcon(new ImageIcon(images[index])); if (isSelected) { this.setBackground(Color.blue); this.setForeground(Color.white); }
Copyright 2003 Mudra Services73 SWING - JList else { this.setBackground(Color.white); this.setForeground(Color.black); } return this; } } // end CustomCellRenderer public ListExample() { setSize(200,200); JList list = new JList(new TestModel()); list.setCellRenderer(new CustomCellRenderer()); getContentPane().add("Center",new JScrollPane(list)); }
Copyright 2003 Mudra Services74 SWING - JList public static void main(String[] args) { ListExample listExample = new ListExample(); listExample.setVisible(true); }
Copyright 2003 Mudra Services75 SWING - JList Listening to list activity addListSelectionListener ListSelectionEvent Any component can be rendered inside the list box. JButton JTextField JCheckBox etc
Copyright 2003 Mudra Services76 SWING - JTable Simple two dimensional display Supports custom data models Supports custom cell rendering Render any component inside the cell Support custom header rendering Highly flexible component Can be customized by the programmer Class is called JTable
Copyright 2003 Mudra Services77 SWING - JTable A JTable which shows information about people
Copyright 2003 Mudra Services78 SWING - JTable package simpletable; import java.awt.*; import javax.swing.*; public class SimpleTableExample extends JFrame { public SimpleTableExample() { setSize(600,300); // create the columns and the values String[] columns = {"Name","Telephone","City","Company"}; String values[][] = { {"Mr. X"," ","Herndon","Bell Atlantic"}, {"Mr. Z"," ","Rockville","Artesia Tech"}, {"Mr. W"," ","Herndon","Intersect Soft"}, {"Mr. A"," ","Herndon","Intelsat"} };
Copyright 2003 Mudra Services79 SWING - JTable JTable table = new JTable(values,columns); JScrollPane pane = new JScrollPane(table); // add the table to the frame getContentPane().add(pane); } public static void main(String[] args) { SimpleTableExample simpleTableExample = new SimpleTableExample(); simpleTableExample.setVisible(true); } } // end program
Copyright 2003 Mudra Services80 SWING - JTable JTable uses the DefaultDataModel class as the model by default A custom data model can be created for the table by extending AbstractTableModel
Copyright 2003 Mudra Services81 SWING - JTable Using a custom table model
Copyright 2003 Mudra Services82 SWING - JTable package simpletable; import java.awt.*; import javax.swing.*; import javax.swing.table.*; public class SimpleTableExample extends JFrame { public SimpleTableExample() { // set the size of the frame setSize(600,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTable table = new JTable(new SimpleTableModel()); table.setShowHorizontalLines(false); JScrollPane pane = new JScrollPane(table); pane.getViewport().setBackground(Color.white); Set the table Background to white
Copyright 2003 Mudra Services83 SWING - JTable // add the table to the frame getContentPane().add(pane); } public static void main(String[] args) { SimpleTableExample simpleTableExample = new SimpleTableExample(); simpleTableExample.setVisible(true); }
Copyright 2003 Mudra Services84 SWING - JTable package simpletable; import javax.swing.table.*; class SimpleTableModel extends AbstractTableModel { // create the columns and the values private String[] columns = {"Name","Telephone","City","Company"}; private String values[][] = { {"Mr. X"," ","Herndon","Bell Atlantic"}, {"Mr. Z"," ","Rockville","Artesia Tech"}, {"Mr. W"," ","Herndon","Intersect Software"}, {"Mr. A"," ","Herndon","Intelsat"} };
Copyright 2003 Mudra Services85 SWING - JTable // Return object at (row,col) public Object getValueAt(int row,int col) { return(values[row][col]); } // Set object at (row,col) public void setValueAt(Object value,int row,int col) { // do nothing } // Return the column count public int getColumnCount() { return(columns.length); }
Copyright 2003 Mudra Services86 SWING - JTable // Return the row count public int getRowCount() { return(values.length); } // Return the column name at col public String getColumnName(int col) { return(columns[col]); } } // end model
Copyright 2003 Mudra Services87 SWING - JTable A JTable in which the second column is right justified with yellow background
Copyright 2003 Mudra Services88 SWING - JTable package simpletable; import java.awt.*; import javax.swing.*; import javax.swing.table.*; public class TelephoneRenderer extends JLabel implements TableCellRenderer { public TelephoneRenderer() { setOpaque(true); }
Copyright 2003 Mudra Services89 SWING - JTable public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected,boolean hasFocus,int row,int column) { this.setHorizontalAlignment(JLabel.RIGHT); this.setText((String)value); this.setBackground(Color.yellow); return(this); } } // end renderer Return the label
Copyright 2003 Mudra Services90 SWING - JTable Associating a cell renderer to a column TableColumn column = table.getColumn("Telephone"); column.setCellRenderer(new TelephoneRenderer()); Table header rendering can be achieved by column.setHeaderRenderer( )
Copyright 2003 Mudra Services91 SWING - JTable Table selection events can be observed by implementing the ListSelectionListener interface. ListSelectionEvent is generated whenever the selections change. table.getSelectionModel().addListSelectionListener(this);
Copyright 2003 Mudra Services92 SWING - JTable public void valueChanged(ListSelectionEvent event) { if (event.getSource() == table.getSelectionModel() && !event.getValueIsAdjusting()) { int row = table.getSelectedRow(); if (row >= 0) { SimpleTableModel model = (SimpleTableModel)table.getModel(); String name = (String)model.getValueAt(row,0); JOptionPane pane = new JOptionPane(); pane.showMessageDialog(this,"Selected : " + name); }
Copyright 2003 Mudra Services93 SWING - JTree Presents hierarchical information Entirely made up of nodes. Every node has a parent except for the root node. Supports custom models custom rendering Class is called JTree
Copyright 2003 Mudra Services94 SWING - JTree Uses the default tree model to create the tree
Copyright 2003 Mudra Services95 SWING - JTree package treeexample; import java.awt.*; import javax.swing.*; import javax.swing.tree.*; public class TreeExample extends JFrame { private JTree jtree; public TreeExample() { // set the size setSize(400,400); // root node DefaultMutableTreeNode filenode = new DefaultMutableTreeNode("TreeExample.java");
Copyright 2003 Mudra Services96 SWING - JTree // immediate children DefaultMutableTreeNode importnode = new DefaultMutableTreeNode("Imports"); DefaultMutableTreeNode datanode = new DefaultMutableTreeNode("Variables"); DefaultMutableTreeNode methodnode = new DefaultMutableTreeNode("Methods"); filenode.add(importnode); filenode.add(datanode); filenode.add(methodnode); // import children DefaultMutableTreeNode awt = new DefaultMutableTreeNode("java.awt.*");
Copyright 2003 Mudra Services97 SWING - JTree DefaultMutableTreeNode swing = new DefaultMutableTreeNode("javax.swing.*"); DefaultMutableTreeNode swingtree = new DefaultMutableTreeNode("javax.swing.tree.*"); importnode.add(awt); importnode.add(swing); importnode.add(swingtree); // data children DefaultMutableTreeNode variable = new DefaultMutableTreeNode("JTree jtree"); datanode.add(variable);
Copyright 2003 Mudra Services98 SWING - JTree // method children DefaultMutableTreeNode method1 = new DefaultMutableTreeNode("JTree()"); DefaultMutableTreeNode method2 = new DefaultMutableTreeNode("main()"); methodnode.add(method1); methodnode.add(method2); // create the tree from the default model DefaultTreeModel model = new DefaultTreeModel(filenode); jtree = new JTree(model); getContentPane().add("Center",new JScrollPane(jtree)); }
Copyright 2003 Mudra Services99 SWING - JTree public static void main(String args[]) { TreeExample treeexample = new TreeExample(); treeexample.setVisible(true); } }// end program
Copyright 2003 Mudra Services100 SWING - JTree Custom data models can be used with the JTree Extends from DefaultTreeModel Object getChild(Object parent,int index) int getChildCount(Object parent) boolean isLeaf(Object node) Each DefaultMutableTreeNode contains a user object which can store any object in the node
Copyright 2003 Mudra Services101 SWING - JTree package customtreeexample; public class JavaFile { private String name; private String[] imports; private String[] variables; private String[] methods; public JavaFile() { name = "CustomTreeExample.java"; imports = new String[] {"java.awt.*","javax.swing.*","javax.swing.tree.*"}; variables = new String[] {"JTree jtree"}; methods = new String[] {"CustomTreeExample()","main()"}; } Hardcoded values
Copyright 2003 Mudra Services102 SWING - JTree public String getName() { return name; } public String[] getSubTypes() { return(new String[] {"Imports","Data","Methods"}); } public String[] getImports() { return(imports); } public String[] getVariables() { return(variables); }
Copyright 2003 Mudra Services103 SWING - JTree public String[] getMethods() { return(methods); } } // end JavaFile
Copyright 2003 Mudra Services104 SWING - JTree package customtreeexample; import javax.swing.tree.*; public class SimpleTreeModel extends DefaultTreeModel { private JavaFile file; private DefaultMutableTreeNode root; private String rootName; public SimpleTreeModel(DefaultMutableTreeNode node,JavaFile file) { super(node); this.file = file; this.rootName = file.getName(); this.root = node; }
Copyright 2003 Mudra Services105 SWING - JTree // get the child at the specified index public Object getChild(Object parent,int index) { DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)parent; String userObject = (String)parentNode.getUserObject(); if (userObject.equals(rootName)) { String[] types = file.getSubTypes(); DefaultMutableTreeNode node = new DefaultMutableTreeNode(types[index]); return(node); }
Copyright 2003 Mudra Services106 SWING - JTree else if (userObject.equals("Imports")) { String[] imports = file.getImports(); DefaultMutableTreeNode node = new DefaultMutableTreeNode(imports[index]); return(node); } else if (userObject.equals("Data")) { String[] variables = file.getVariables(); DefaultMutableTreeNode node = new DefaultMutableTreeNode(variables[index]); return(node); }
Copyright 2003 Mudra Services107 SWING - JTree else if (userObject.equals("Methods")) { String[] methods = file.getMethods(); DefaultMutableTreeNode node = new DefaultMutableTreeNode(methods[index]); return(node); } return(null); } // end getChild()
Copyright 2003 Mudra Services108 SWING - JTree // get the child count for the parent public int getChildCount(Object parent) { DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)parent; String userObject = (String)parentNode.getUserObject(); if (userObject.equals(rootName)) { return(file.getSubTypes().length); } else if (userObject.equals("Imports")) { return(file.getImports().length); }
Copyright 2003 Mudra Services109 SWING - JTree else if (userObject.equals("Data")) { return(file.getVariables().length); } else if (userObject.equals("Methods")) { return(file.getMethods().length); } return(0); } // end getChildCount()
Copyright 2003 Mudra Services110 SWING - JTree // return TRUE if the node is a leaf public boolean isLeaf(Object node) { DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)node; String userObject = (String)parentNode.getUserObject(); if (userObject.equals(rootName) || userObject.equals("Imports") || userObject.equals("Data") || userObject.equals("Methods")) { return(false); } return(true); } } // end SimpleTreeModel
Copyright 2003 Mudra Services111 SWING - JTree Custom Rendering Useful for changing icons, fonts etc Implement TreeCellRenderer class Component getTreeCellRendererComponent(…) must be implemented Nodes can contain any Component (TextField, Checkbox etc) Listening to tree selections Implement TreeSelectionListener
Copyright 2003 Mudra Services112 SWING - JTree Listening for Tree expansions Implement TreeExpansionListener Hiding root node tree.setRootVisible(false); Other methods tree.expandPath(path) tree.collapsePath(path) tree.setSelectionPath(path) tree.clearSelection()
Copyright 2003 Mudra Services113 SWING – Exercise 4
Copyright 2003 Mudra Services114 SWING – Exercise 4 Add a JTable to the center panel which shows the name of the file/directory and the size as columns. Whenever a file or directory is chosen it should update the table. What mechanism would you use to make the size column right justified?
Copyright 2003 Mudra Services115 SWING – Look And Feel Supports different look and feel Metal Motif Windows Mac MVC pattern Can create corporate look and feel Change the look And Feel UIManager.setLookAndFeel(“ ”);
Copyright 2003 Mudra Services116 SWING – Look And Feel Add this code to the tree example UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.Wind owsLookAndFeel");
Copyright 2003 Mudra Services117 SWING - Multithreading Threads can improve performance by allowing simultaneous execution of two or more related tasks Event Dispatching thread Event Dispatching thread and data collection threads can be separate but needs synchronization For performance Once a Swing component is displayed on the screen they cannot be changed from any thread other than the event dispatching thread Inherently Multi-thread unsafe
Copyright 2003 Mudra Services118 SWING - Multithreading invokeLater Queues the GUI request. The event dispatching thread will pick it up and execute it at some later time invokeAndWait Queues and waits till the task is performed. DO NOT CALL THIS FROM THE EVENT DISPATCHING THREAD
Copyright 2003 Mudra Services119 SWING - Multithreading class RunnableClass implements Runnable { public void run() { // do gui work here } // will queue the request for the event dispatching thread // to execute SwingUtilities.invokeLater(new RunnableClass());
Copyright 2003 Mudra Services120 SWING Exercise 5 Change the code for exercise 4 so that the output is in windows look and feel
Copyright 2003 Mudra Services121 SWING – Popular IDEs Integrated Development Environments Borland JBuilder (most popular) WebGain Visual Café IBM VisualAge For Java Sun[tm] ONE Studio 4
Copyright 2003 Mudra Services122 What’s Next Threads Go from single threaded applications to multithreaded applications Networking Go from one user applications to muti user applications Distributed Objects Go from objects in single JVM to objects in multiple JVMs (maybe in different machines)