Escolar Documentos
Profissional Documentos
Cultura Documentos
Walter Milner
What is Swing?
A group of 14 packages to do with the UI 451 classes as at 1.4 (!) Part of JFC Java Foundation Classes (compare now defunct MFC)
createAndShowGUI
private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("Hi.."); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Add a label. JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); //Display the window. frame.pack(); frame.setVisible(true); } Try this out
Layout Managers
Most Swing UIs utilise a LayoutManager to control positioning of items There is a choice of these which work in different ways Initially we do without one, and position items ourselves: frame.setLayout(null);
Absolute positioning
JFrame frame = new JFrame("I am a JFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(20,30,300,100); frame.setLayout(null); JButton butt=new JButton("Click me"); frame.getContentPane().add(butt); butt.setBounds(20, 20, 200,20); frame.setVisible(true);
Try this out - start with last example and put this in CreateandShowGUI()
Event-handling
Event object when clicked component eg button interface eg ActionListener the listener eg JFrame
Interfaces
An interface is a set of methods eg the ActionListener interface has just one method public void actionPerformed(ActionEvent e) A class can declare that it implements it eg public class Main implements ActionListener Then it must actually define the methods in that interface Or the compiler will complain Classes can implement multiple interfaces
Which button?
If have several buttons, all must link to actionPerformed How to know which button was clicked? Use the .getSource method of the ActionEvent object
CDE/Motif
Windows
Metal
Setting a laf
try { UIManager.setLookAndFeel( "com.sun.java.swing.plaf.motif.MotifLookAndFeel" ); } catch (Exception e) { System.out.println("Cant get laf"); } .. JFrame frame = new JFrame();
This in main() - set laf as first step try .. catch.. because could fail UIManager is in java.lang
Java Swing Walter Milner 2005: Slide 17
Decorated
JFrame.setDefaultLookAndFeelDecorated(true); .. call JFrame constructor
Containers
top level containers - JFrame JApplet JDialog
general purpose containers panel scroll pane split pane tabbed pane tool bar
JPanel ( in createAndShowGUI)
JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("I am a JFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(20,30,300,100); frame.setLayout(null); //Create a panel JPanel myPanel = new JPanel(); myPanel.setBackground(new Color(255,3,25)); myPanel.setOpaque(true); //Make it the content pane. frame.setContentPane(myPanel); frame.setVisible(true);
Java Swing Walter Milner 2005: Slide 22
JPanel
Is a subclass of JComponent So are all the other Swing components except the top-level containers You can add a border And a tool-tip
..
myPanel.setOpaque(true); myPanel.setToolTipText("I'm a JPanel"); myPanel.setBorder(BorderFactory.createLineBorder(Color.white)); frame.setContentPane(myPanel); ..
Java Swing Walter Milner 2005: Slide 24
JSplitPane
.. setLayout(null); //Create a split pane JSplitPane myPane = new JSplitPane(); myPane.setOpaque(true); frame.setContentPane(myPane); frame.setVisible(true);
Exercise
Program this The buttons set the colour of the left hand pane
JTextField
For single-line text input Methods getText, setText Can use ActionListener, triggered when Enter pressed
Example of JTextField
See source in Word doc Check Main object fields for label and textfield Make a panel, set as content pane Make and add text field Add actionlistener Make and add a label Program actionPerformed
JTextArea
JPanel myPanel = new JPanel(); app.textArea = new JTextArea("Type here",5, 20); myPanel.add(app.textArea); TextArea expands rows and columns as needed
JScrollPane
JTextArea textArea = new JTextArea("Type here",5, 20); JScrollPane scrollPane = new JScrollPane(textArea); frame.setContentPane(scrollPane);
Exercise
Program this Use the selectAll and cut methods of JTextComponent, which JTextArea inherits
..
Timer t = new Timer(1000, app); t.start(); app.label = new JLabel("Time"); app.label.setBounds(20,20,200,20); frame.getContentPane().add(app.label); .. public void actionPerformed(ActionEvent e) { String now = (new java.util.Date()).toString(); label.setText(now); }
Timer
JFrame frame = new JFrame("I am Celsius"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(20,30,200,200); frame.getContentPane().setLayout(null); ImageIcon icon = new ImageIcon("c:/celsius.jpg", "Celsius"); JLabel label = new JLabel(icon); label.setBounds(20,20,150,150); frame.getContentPane().add(label); frame.setVisible(true);
Images
JScrollBar
See source code JScrollBar and JLabel Constructor arguments implements AdjustmentListener adjustmentValueChanged e.getValue()
Exercise
Program this The scroll bars determine the red, green and blue components of the background of the panel
JCheckBox
See source code implements ActionListener isSelected()
Exercise
Program this The checkbox determines if the text in the label is left or right aligned
RadioButton
Come in groups only 1 selected per group See demo code Make radiobuttons Make group Add radiobuttons to group ActionListener
RadioButton Exercise
Modify the demo by adding more colour options
ListBox
See source code Data held in array List box shows array List box inside scroll pane myList.getModel().getElementAt(..
Two JListBoxes
See source code We want to add items to list So use a Vector not an array to hold data Check methods to delete items and copy to other listbox
Exercise
Add a button to the last example which deletes selected items in the second list box
Layout Managers
A layout manager controls the positioning of components Components have a 'preferred size' so can avoid sizing them .pack() adjusts size of a container to fit components
Some LayoutManagers
FlowLayout
JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("FlowLayout"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(new FlowLayout()); JButton b1 = new JButton("Hello"); frame.getContentPane().add(b1); JButton b2 = new JButton("Two"); frame.getContentPane().add(b2); JTextField t1 = new JTextField("Text here"); frame.getContentPane().add(t1); Try this frame.pack(); Try re-sizing the frame at runtime frame.setVisible(true); Add more buttons
Add frame.setBounds Remove pack();
BorderLayout
JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("Border"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton b1 = new JButton("At the top"); frame.getContentPane().add(b1,BorderLayout.PAGE_START ); JButton b2 = new JButton("Bottom"); frame.getContentPane().add(b2,BorderLayout.PAGE_END); JTextField t1 = new JTextField("Left"); frame.getContentPane().add(t1,BorderLayout.LINE_START); JTextField t2 = new JTextField("Right"); frame.getContentPane().add(t2,BorderLayout.LINE_END); JButton b3 = new JButton("Centre"); frame.getContentPane().add(b3,BorderLayout.CENTER ); Try this frame.pack(); frame.setVisible(true); Java Swing Walter Milner 2005: Slide 48
Grid
JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("Grid"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(new GridLayout(4,3,5,5)); for (int i=0; i<10; i++) frame.getContentPane().add(new JButton(""+i)); frame.pack(); frame.setVisible(true);
Combination layouts
See source code Frame is null layout Frame has an upper and lower panel Upper panel null layout Lower panel is grid layout Note font of display
Menus
JMenuBar
JMenu JMenuItem
Menu
Main app = new Main(); .. JMenuBar myMenuBar = new JMenuBar(); JMenu menu1 = new JMenu("File"); JMenuItem item = new JMenuItem("Exit"); item.addActionListener(app); menu1.add(item); myMenuBar.add(menu1); frame.setJMenuBar(myMenuBar); .. public void actionPerformed(ActionEvent e) { System.exit(0); }
Java Swing Walter Milner 2005: Slide 52
Menu Options
See source code
Exercise Copy this Add a second option 'Edit' after 'File' Put choices Undo, Redo, Cut Copy and Paste in it Use appropriate icons if possible
JToolBar
.. .. frame is BorderLayout .. JToolBar toolBar = new JToolBar("Test"); JButton butt1 = new JButton(new ImageIcon("icon.gif")); toolBar.add(butt1); .. frame.add(toolBar, BorderLayout.PAGE_START);
JComponents have a paint() method This is called by the system when it needs to display the object Initially and eg after a re-size You can over-ride paint() to control the appearance of the component
paint
public class MyFrame extends JFrame { public MyFrame() { super("Some title"); setDefaultCloseOperation(EXIT_ON_CLOSE); setBounds(20,30,230,180); myPanel = new MyPanel(); myPanel.setOpaque(true); setContentPane(myPanel); setVisible(true); } MyPanel myPanel; } public class MyPanel extends JPanel { public void paint(Graphics g) { g.drawLine(0,0,getWidth(),getHeight()); g.drawString("Hello",getWidth()/2,getHeight()/2); } }
Example