Copyright 2003 Mudra Services1 SWING - JTabbedPane Helps stack pages of information into a single...

Preview:

Citation preview

Copyright 2003 Mudra Services

1

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 Services

2

SWING - JTabbedPane

Clicking on Name tab

Copyright 2003 Mudra Services

3

SWING - JTabbedPane

Clicking on Address tab

Copyright 2003 Mudra Services

4

SWING - JTabbedPane

Clicking on Other tab

Copyright 2003 Mudra Services

5

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 Services

6

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 Services

7

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 Services

8

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 Services

9

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 Services

10

SWING - JTabbedPane

// create main program public static void main(String[] args) { TabbedExample tabbedExample = new

TabbedExample(); tabbedExample.pack(); tabbedExample.setVisible(true); }

}

Copyright 2003 Mudra Services

11

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 Services

12

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 Services

13

SWING - JScrollPane

An image being scrolled

Copyright 2003 Mudra Services

14

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 Services

15

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 Services

16

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 Services

17

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 Services

18

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 Services

19

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 Services

20

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 Services

21

SWING - JSplitPane

A window split into two panels

Vertical Split

Copyright 2003 Mudra Services

22

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 Services

23

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 Services

24

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 Services

25

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 Services

26

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 Services

27

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 Services

28

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 Services

29

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 Services

30

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 Services

31

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 Services

32

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 Services

33

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 Services

34

SWING - Action

Shows the disabled actions

Copyright 2003 Mudra Services

35

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 Services

36

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 Services

37

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 Services

38

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 Services

39

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 Services

40

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 toMenu bar

Add actions toTool bar

Copyright 2003 Mudra Services

41

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 toPopup menu item

Copyright 2003 Mudra Services

42

SWING - Action

public static void main(String[] args) {

ActionExample actionExample = new ActionExample();

// pack and show actionExample.setVisible(true); }

}

Copyright 2003 Mudra Services

43

SWING - JDialog

Secondary application window Almost like a JFrame

But supports modal operation. Extends from the Dialog class in AWT

Copyright 2003 Mudra Services

44

SWING - JDialog

A JDialog window

Copyright 2003 Mudra Services

45

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 Services

46

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 Services

47

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 Services

48

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 Services

49

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 Services

50

SWING - JOptionPane

JOptionPane option = new JOptionPane();

option.showMessageDialog(this,"This is an Error" ,"Error",JOptionPane.ERROR_MESSAGE);

Copyright 2003 Mudra Services

51

SWING - JOptionPane

JOptionPane option = new JOptionPane();

option.showMessageDialog(this,"This is an Warning"

,"Warning",JOptionPane.WARNING_MESSAGE);

Copyright 2003 Mudra Services

52

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 Services

53

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 Services

54

SWING - JColorChooser

Color color = JColorChooser.showDialog(this,"Choose a Color",Color.blue);

// Act on the color chosen by the user

Copyright 2003 Mudra Services

55

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 Services

56

SWING - JFileChooser

A file chooser

Copyright 2003 Mudra Services

57

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 Services

58

SWING - JInternalFrame

Copyright 2003 Mudra Services

59

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 Services

60

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 Services

61

SWING - JInternalFrame

public static void main(String[] args) { InternalExample internalExample = new

InternalExample(); internalExample.setVisible(true); }

} // end Internal Example

Copyright 2003 Mudra Services

62

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 Services

63

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 Services

64

SWING – Exercise 3

Copyright 2003 Mudra Services

65

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 Services

66

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 Services

67

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 Services

68

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 Services

69

SWING - JList

Copyright 2003 Mudra Services

70

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 Services

71

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 Services

72

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 Services

73

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 Services

74

SWING - JList

public static void main(String[] args) { ListExample listExample = new ListExample(); listExample.setVisible(true); }}

Copyright 2003 Mudra Services

75

SWING - JList

Listening to list activity addListSelectionListener ListSelectionEvent

Any component can be rendered inside the list box. JButton JTextField JCheckBox etc

Copyright 2003 Mudra Services

76

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 Services

77

SWING - JTable

A JTable which shows information about people

Copyright 2003 Mudra Services

78

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","703-4228989","Herndon","Bell Atlantic"}, {"Mr. Z","301-6748989","Rockville","Artesia Tech"}, {"Mr. W","703-4258999","Herndon","Intersect Soft"}, {"Mr. A","703-7864456","Herndon","Intelsat"} };

Copyright 2003 Mudra Services

79

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 Services

80

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 Services

81

SWING - JTable

Using a custom table model

Copyright 2003 Mudra Services

82

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 tableBackground to white

Copyright 2003 Mudra Services

83

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 Services

84

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","703-4228989","Herndon","Bell Atlantic"}, {"Mr. Z","301-6748989","Rockville","Artesia Tech"}, {"Mr. W","703-4258999","Herndon","Intersect Software"}, {"Mr. A","703-7864456","Herndon","Intelsat"} };

Copyright 2003 Mudra Services

85

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 Services

86

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 Services

87

SWING - JTable

A JTable in which the second column is right justified with yellow background

Copyright 2003 Mudra Services

88

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 Services

89

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 Services

90

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(<renderer>)

Copyright 2003 Mudra Services

91

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 Services

92

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 Services

93

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 Services

94

SWING - JTree

Uses the default tree model to create the tree

Copyright 2003 Mudra Services

95

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 Services

96

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 Services

97

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 Services

98

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 Services

99

SWING - JTree

public static void main(String args[]) { TreeExample treeexample = new TreeExample(); treeexample.setVisible(true); }

}// end program

Copyright 2003 Mudra Services

100

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 Services

101

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 Services

102

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 Services

103

SWING - JTree

public String[] getMethods() { return(methods); }

} // end JavaFile

Copyright 2003 Mudra Services

104

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 Services

105

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 Services

106

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 Services

107

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 Services

108

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 Services

109

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 Services

110

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 Services

111

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 Services

112

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 Services

113

SWING – Exercise 4

Copyright 2003 Mudra Services

114

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 Services

115

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(“<class name>”);

Copyright 2003 Mudra Services

116

SWING – Look And Feel

Add this code to the tree example

UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.

WindowsLookAndFeel");

Copyright 2003 Mudra Services

117

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 Services

118

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 Services

119

SWING - Multithreading

class RunnableClass implements Runnable {public void run() {

// do gui work here}

}

// will queue the request for the event dispatching thread// to executeSwingUtilities.invokeLater(new RunnableClass());

Copyright 2003 Mudra Services

120

SWING Exercise 5

Change the code for exercise 4 so that the output is in windows look and feel

Copyright 2003 Mudra Services

121

SWING – Popular IDEs

Integrated Development Environments Borland JBuilder (most popular)

http://www.borland.com/jbuilder/index.html WebGain Visual Café

http://www.webgain.com/products/visual_cafe/ IBM VisualAge For Java

http://www-3.ibm.com/software/ad/vajava/ Sun[tm] ONE Studio 4

http://wwws.sun.com/software/sundev/jde/index.html

Copyright 2003 Mudra Services

122

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)

Recommended