290 likes | 427 Views
Graphical User Interfaces. Allow for interaction with Buttons Menus Text Fields Two Java Libraries to assist in GUI Programming AWT Swing. Text Fields. provide a line of user-updatable text need to - import javax.swing.*; - declare a variable private JTextField input;
E N D
Graphical User Interfaces • Allow for interaction with • Buttons • Menus • Text Fields • Two Java Libraries to assist in GUI Programming • AWT • Swing
Text Fields • provide a line of user-updatable text • need to - import javax.swing.*; - declare a variable private JTextField input; - construct input = new JTextField( "Enter text here " ); - place in a window - use. For example, String userInput = input.getText();
User enters desired text in the text field at the north of the window • With each click on the canvas, the text is displayed
import objectdraw.*; import java.awt.*; import javax.swing.*; public class TextController extends WindowController { private JTextField input; public void begin() { input = new JTextField( "Enter text here" ); Container contentPane = getContentPane(); contentPane.add( input, BorderLayout.NORTH ); contentPane.validate(); } public void onMouseClick( Location point ){ new Text( input.getText(), point, canvas ); } }
The Container Class • Graphical components must be put in a Container to be displayed import java.awt.*; Container contentPane = getContentPane(); contentPane.add( aComponent, position ); • Validate to be sure components displayed properly
Layout of Components in a Container • Many layout options • One example: BorderLayout • BorderLayout.NORTH • BorderLayout.EAST • BorderLayout.SOUTH • BorderLayout.WEST • BorderLayout.CENTER
Buttons Let’s add a button to our previous program. Clicking on the button clears the canvas. • Want clicks on the button to trigger a program action • Requires slightly more programming effort than text fields
import objectdraw.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TextButtonController extends WindowController implements ActionListener { private JTextField input; public void begin() { input = new JTextField( "Enter text here" ); JButton clearButton = new JButton(" Clear canvas "); Container contentPane = getContentPane(); contentPane.add( input, BorderLayout.NORTH ); contentPane.add( clearButton, BorderLayout.SOUTH ); contentPane.validate(); clearButton.addActionListener(this); }
public void onMouseClick( Location point ){ new Text( input.getText(), point, canvas ); } public void actionPerformed( ActionEvent evt ) { canvas.clear(); } }
Action Events • When a JButton is clicked • an ActionEvent is generated • actionPerformed is executed • Just as onMouseClick is executed whenever a user clicks on the canvas • actionPerformed is provided with a parameter • Contains information about the object that triggered the event
Checklist for using JButtons • Construct the JButton • Add it to the content pane of the WindowController extension and validate • So that the WindowController extension responds to events generated by the JButton • Add this as a listener • Make sure WindowController extension implements ActionListener • Add actionPerformed method
Combo Boxes • The Swing package’s name for pop-up menus: JComboBox • Let’s use one to control the speed of a simple falling ball animation • Three speed options: slow, medium, fast FallingBall.java
Using a JComboBox MenuBallController.java
Checklist for JComboBoxes • Construct the JComboBox and add selection options • Add it to the content pane of the WindowController extension and validate • So that the WindowController extension responds to events generated • Add this as a listener • Make sure WindowController extension implements ActionListener • Add actionPerformed method
Better GUI design: basic tools • Panels • Layout Managers
The JPanel • Provided by Swing • Organize subcomponents • Add subcomponents to JPanel • Add JPanel to Container
Organizing JButtons in a JPanel • Construct the JPanel JPanel southPanel = new JPanel(); • After each JButton is constructed, add it to the JPanel southPanel.add( fastButton ); southPanel.add( mediumButton ); southPanel.add( slowButton ); • Add the JPanel to the container contentPane.add(southPanel, BorderLayout.SOUTH);
FlowLayout • JPanels use a different layout manager: FlowLayout • Lays out its components left to right
Which button? If we make this a listener for each of the three buttons, as we have before…actionPerformed method must determine which one clicked public void actionPerformed(ActionEvent evt) { if (evt.getSource() == slowButton) { speed = SLOW_SPEED; } else if (evt.getSource() == mediumButton) { speed = MEDIUM_SPEED; } else { speed = FAST_SPEED; } if (droppedBall != null) { droppedBall.setSpeed(speed); } }
More on Layout Managers • Determine how GUI components should be displayed • Do their best to accommodate when user changes window size • Some useful layout managers: • BorderLayout: adds to sides or center • FlowLayout: adds left to right • GridLayout: divides a container into equally sized parts • southPanel.setLayout( new GridLayout(1, 3) );
Sliders • Used to graphically select values in a range • Can be vertical or horizontal • stateChanged method replaces actionPerformed • Swing’s name: JSlider
A slider for controlling speed import objectdraw.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class SliderBallController extends WindowController implements ChangeListener { private JSlider speedSlider; public void begin() { speedSlider = new JSlider (JSlider.HORIZONTAL, SLOW_SPEED, FAST_SPEED, SLOW_SPEED); speedSlider.addChangeListener(this); }
A slider for controlling speed • public void stateChanged (ChangeEvent evt) { • speed = speedSlider.getValue(); • If (droppedBall != null) { • droppedBall.setSpeed(speed); • } • } • } • Complete SliderBallController class
Checklist for JSliders • Construct the JSlider; provide four parameters: • Constant that says whether vertical or horizontal • Minimum and maximum integer values for slider • Initial value of the slider • Add it to the content pane of the WindowController extension and validate • So that the WindowController extension responds to events generated • Add this as a listener • Make sure WindowController extension implements ChangeListener • Add stateChanged method • Import javax.swing.event package
Labels • JLabel class provided by Swing • Single line of read-only text • A passive component - no event listener required! • Useful for providing labels for sliders, text fields, etc.
Using JLabels • Two ways to construct • Providing text only JLabel speedLabel = new JLabel("Speed is "); • Providing text and justification JLabel speedLabel = new JLabel("Speed is ", JLabel.RIGHT); • Modifiable with setText method speedLabel.setText("Speed is " + speed); LabelBallController.java
Handling Keystrokes • Can write Java programs so that every keystroke made by the user generates an event that can be handled • No need to add special components to our already-existing window
Handling Keystrokes • Need to associate listener with keyboard events this.addKeyListener( this ); // in a WindowController extension canvas.addKeyListener( this ); // sometimes need this! setFocusable( true ); • Need to make sure listener has appropriate method to handle key events • public void keyPressed ( KeyEvent evt ) • public void keyReleased ( KeyEvent evt ) • public void keyTyped ( KeyEvent evt ) • KeyEvents include: VK_A – VK_Z, VK_0 – VK_9
Review • Construct the GUI component • Add the component to a container (i.e., a panel or the content pane of a window) • If a listener is needed • Add this as a listener for the GUI component • Make sure the WindowController extension implements the appropriate listener interface • Add the event-handling methods promised by the listener interface