event-driven programming csci 201l jeffrey miller, ph.d. http :// www - scf. usc. edu /~ csci 201...
DESCRIPTION
Event-Driven Programming Overview ▪The code we have written so far executed deterministically from top to bottom, calling methods and utilizing other classes ›We utilized user input to determine code that was executed in some cases, but we had prompted the user and waited for a response ▪In GUI programming, the code that gets called is based on events, such as a user clicking or a user typing something ›We don’t know the order in which users will perform the actions though ›We need to associate an action with a method USC CSCI 201L3/23 Event-Driven Programming OverviewTRANSCRIPT
Event-Driven ProgrammingCSCI 201L
Jeffrey Miller, Ph.D.
HTTP://WWW-SCF.USC.EDU/~CSCI201
USC CSCI 201L
Outline
USC CSCI 201L 2/23
▪ Event-Driven Programming Overview▪ Event-Driven Programming Example▪ Adapter Classes▪ Program
Event-Driven Programming Overview
▪ The code we have written so far executed deterministically from top to bottom, calling methods and utilizing other classes› We utilized user input to determine code that was
executed in some cases, but we had prompted the user and waited for a response
▪ In GUI programming, the code that gets called is based on events, such as a user clicking or a user typing something› We don’t know the order in which users will perform the
actions though› We need to associate an action with a method
USC CSCI 201L 3/23Event-Driven Programming Overview
Fired EventsSource Object User Action Event Type Fired
JButton Click the button ActionEvent
JTextField Press enter key ActionEvent
JComboBox Select an item ItemEvent, ActionEvent
JList Select one or more items ListSelectionEvent
JCheckBox Click a check box ItemEvent, ActionEvent
JRadioButton Click a radio button ItemEvent, ActionEvent
JMenuItem Select a menu item ActionEvent
JScrollBar Move the scroll bar AdjustmentEvent
JSlider Move the slider bar ChangeEvent
Window Open, closing, closed, iconify, deiconify, activate, deactive the window
WindowEvent
Container Component added or removed from the container ContainerEvent
Component
Mouse pressed, released, clicked, entered, or exited MouseEvent
Mouse moved or dragged MouseEvent
Key pressed or released KeyEvent
Component moved, resized, hidden, or shown ComponentEvent
Component gained or lost focus FocusEvent
USC CSCI 201L 4/23Event-Driven Programming Overview
• Note: If a component can fire an event, any subclass of the component can fire the same type of event Every Component can fire a MouseEvent, KeyEvent, FocusEvent, and ComponentEvent since
Component is the superclass of GUI components
Listeners
▪ Java uses a delegation-based model for event handling› A source object fires an event› An object interested in the event, called a listener, handles it
• A listener must be an instance of a listener interface and must be registered with a source component
› From the last lecture, we saw25 JButton button2 = new JButton("2");26 button2.addActionListener(new ButtonClicked("first", outerPanel));
› And then35 class ButtonClicked implements ActionListener {36 private String numberString;37 private JPanel jp;38 public ButtonClicked(String numberString, JPanel jp) {39 this.numberString = numberString;40 this.jp = jp;41 }42 public void actionPerformed(ActionEvent ae) {43 CardLayout cl = (CardLayout)jp.getLayout();44 cl.show(jp, numberString);45 }46 }
USC CSCI 201L 5/23Event-Driven Programming Overview
Fired EventsEvent Class Listener Interface Listener Methods
ActionEvent ActionListener actionPerformed(ActionEvent)
ItemEvent ItemListener itemStateChanged(ItemEvent)
MouseEventMouseListener
mousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)
MouseMotionListener mouseDragged(MouseEvent)mouseMoved(MouseEvent)
KeyEvent KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)
WindowEvent WindowListener
windowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)
ContainerEvent ContainerListener componentAdded(ContainerEvent)componentRemoved(ContainerEvent)
ComponentEvent ComponentListener
componentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)
FocusEvent FocusListener focusGained(FocusEvent)focusLost(FocusEvent)
AdjustmentEvent AdjustmentListener adjustmentValueChanged(AdjustmentEvent)
ChangeEvent ChangeListener stateChanged(ChangeEvent)
ListSelectionEvent ListSelectionListener valueChanged(ListSelectionEvent)
USC CSCI 201L 6/23Event-Driven Programming Overview
Outline
USC CSCI 201L 7/23
▪ Event-Driven Programming Overview▪ Event-Driven Programming Example▪ Adapter Classes▪ Program
GUI with Events
USC CSCI 201L 8/23Event-Driven Programming Example
Create the following GUI
Event-Driven Programming Example1 import java.awt.event.ActionEvent;2 import java.awt.event.ActionListener;34 import javax.swing.BoxLayout;5 import javax.swing.JButton;6 import javax.swing.JFrame;7 import javax.swing.JLabel;8 import javax.swing.JPanel;9 import javax.swing.JTextField;10 11 public class Test extends JFrame {12 private JTextField num1TF, num2TF, totalTF;13 private JLabel number1Label, number2Label;14 private JButton concatenateButton;15 public Test() {16 super("Event-Driven Programming Example");17 number1Label = new JLabel("Number 1");18 num1TF = new JTextField("", 15);19 number2Label = new JLabel("Number 2");20 num2TF = new JTextField("", 15);21 totalTF = new JTextField("", 20);22 concatenateButton = new JButton("Concatenate");23 concatenateButton.addActionListener(24 new ConcatenateAdapter(num1TF, num2TF, totalTF));25 26 JPanel row1Panel = new JPanel();27 row1Panel.add(number1Label);28 row1Panel.add(num1TF);2930 JPanel row2Panel = new JPanel();31 row2Panel.add(number2Label);32 row2Panel.add(num2TF);33 34 JPanel row3Panel = new JPanel();35 row3Panel.add(concatenateButton);3637 JPanel row4Panel = new JPanel();38 row4Panel.add(totalTF);
USC CSCI 201L 9/23Event-Driven Programming Example
39 JPanel verticalPanel = new JPanel();40 verticalPanel.setLayout(new BoxLayout(verticalPanel, BoxLayout.Y_AXIS));41 verticalPanel.add(row1Panel);42 verticalPanel.add(row2Panel);43 verticalPanel.add(row3Panel);44 verticalPanel.add(row4Panel); 45 46 add(verticalPanel);47 setSize(250, 175);48 setLocationRelativeTo(null);49 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);50 setVisible(true);51 }52 53 public static void main(String args[]) {54 Test t = new Test();55 }56 }5758 class ConcatenateAdapter implements ActionListener {59 private JTextField num1TF, num2TF, totalTF;60 public ConcatenateAdapter(JTextField num1TF, JTextField num2TF, JTextField totalTF) {61 this.num1TF = num1TF;62 this.num2TF = num2TF;63 this.totalTF = totalTF;64 }6566 public void actionPerformed(ActionEvent ae) {67 totalTF.setText(num1TF.getText() + num2TF.getText());68 }69 }
Event-Driven Programming Example1 import java.awt.event.ActionEvent;2 import java.awt.event.ActionListener;34 import javax.swing.BoxLayout;5 import javax.swing.JButton;6 import javax.swing.JFrame;7 import javax.swing.JLabel;8 import javax.swing.JPanel;9 import javax.swing.JTextField;10 11 public class Test extends JFrame {12 private JTextField num1TF, num2TF, totalTF;13 private JLabel number1Label, number2Label;14 private JButton concatenateButton;15 public Test() {16 super("Event-Driven Programming Example");17 number1Label = new JLabel("Number 1");18 num1TF = new JTextField("", 15);19 number2Label = new JLabel("Number 2");20 num2TF = new JTextField("", 15);21 totalTF = new JTextField("", 20);22 concatenateButton = new JButton("Concatenate");23 concatenateButton.addActionListener(24 new ConcatenateAdapter(num1TF, num2TF, totalTF));25 26 JPanel row1Panel = new JPanel();27 row1Panel.add(number1Label);28 row1Panel.add(num1TF);2930 JPanel row2Panel = new JPanel();31 row2Panel.add(number2Label);32 row2Panel.add(num2TF);33 34 JPanel row3Panel = new JPanel();35 row3Panel.add(concatenateButton);3637 JPanel row4Panel = new JPanel();38 row4Panel.add(totalTF);
USC CSCI 201L 10/23Event-Driven Programming Example
39 JPanel verticalPanel = new JPanel();40 verticalPanel.setLayout(new BoxLayout(verticalPanel, BoxLayout.Y_AXIS));41 verticalPanel.add(row1Panel);42 verticalPanel.add(row2Panel);43 verticalPanel.add(row3Panel);44 verticalPanel.add(row4Panel); 45 46 add(verticalPanel);47 setSize(250, 175);48 setLocationRelativeTo(null);49 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);50 setVisible(true);51 }52 53 public static void main(String args[]) {54 Test t = new Test();55 }5657 class ConcatenateAdapter implements ActionListener {58 private JTextField num1TF, num2TF, totalTF;59 public ConcatenateAdapter(JTextField num1TF, JTextField num2TF, JTextField totalTF) {60 this.num1TF = num1TF;61 this.num2TF = num2TF;62 this.totalTF = totalTF;63 }6465 public void actionPerformed(ActionEvent ae) {66 totalTF.setText(num1TF.getText() + num2TF.getText());67 }68 }69 }
Event-Driven Programming Example1 import java.awt.event.ActionEvent;2 import java.awt.event.ActionListener;34 import javax.swing.BoxLayout;5 import javax.swing.JButton;6 import javax.swing.JFrame;7 import javax.swing.JLabel;8 import javax.swing.JPanel;9 import javax.swing.JTextField;10 11 public class Test extends JFrame {12 private JTextField num1TF, num2TF, totalTF;13 private JLabel number1Label, number2Label;14 private JButton concatenateButton;15 public Test() {16 super("Event-Driven Programming Example");17 number1Label = new JLabel("Number 1");18 num1TF = new JTextField("", 15);19 number2Label = new JLabel("Number 2");20 num2TF = new JTextField("", 15);21 totalTF = new JTextField("", 20);22 concatenateButton = new JButton("Concatenate");23 concatenateButton.addActionListener(24 new ConcatenateAdapter());25 26 JPanel row1Panel = new JPanel();27 row1Panel.add(number1Label);28 row1Panel.add(num1TF);2930 JPanel row2Panel = new JPanel();31 row2Panel.add(number2Label);32 row2Panel.add(num2TF);33 34 JPanel row3Panel = new JPanel();35 row3Panel.add(concatenateButton);3637 JPanel row4Panel = new JPanel();38 row4Panel.add(totalTF);
USC CSCI 201L 11/23Event-Driven Programming Example
39 JPanel verticalPanel = new JPanel();40 verticalPanel.setLayout(new BoxLayout(verticalPanel, BoxLayout.Y_AXIS));41 verticalPanel.add(row1Panel);42 verticalPanel.add(row2Panel);43 verticalPanel.add(row3Panel);44 verticalPanel.add(row4Panel); 45 46 add(verticalPanel);47 setSize(250, 175);48 setLocationRelativeTo(null);49 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);50 setVisible(true);51 }52 53 public static void main(String args[]) {54 Test t = new Test();55 }5657 class ConcatenateAdapter implements ActionListener {65 public void actionPerformed(ActionEvent ae) {66 Test.this.totalTF.setText(Test.this.num1TF.getText() + Test.this.num2TF.getText());67 }68 }69 }
Event-Driven Programming Example1 import java.awt.event.ActionEvent;2 import java.awt.event.ActionListener;34 import javax.swing.BoxLayout;5 import javax.swing.JButton;6 import javax.swing.JFrame;7 import javax.swing.JLabel;8 import javax.swing.JPanel;9 import javax.swing.JTextField;10 11 public class Test extends JFrame {12 private JTextField num1TF, num2TF, totalTF;13 private JLabel number1Label, number2Label;14 private JButton concatenateButton;15 public Test() {16 super("Event-Driven Programming Example");17 number1Label = new JLabel("Number 1");18 num1TF = new JTextField("", 15);19 number2Label = new JLabel("Number 2");20 num2TF = new JTextField("", 15);21 totalTF = new JTextField("", 20);22 concatenateButton = new JButton("Concatenate");23 concatenateButton.addActionListener(24 new ConcatenateAdapter());25 26 JPanel row1Panel = new JPanel();27 row1Panel.add(number1Label);28 row1Panel.add(num1TF);2930 JPanel row2Panel = new JPanel();31 row2Panel.add(number2Label);32 row2Panel.add(num2TF);33 34 JPanel row3Panel = new JPanel();35 row3Panel.add(concatenateButton);3637 JPanel row4Panel = new JPanel();38 row4Panel.add(totalTF);
USC CSCI 201L 12/23Event-Driven Programming Example
39 JPanel verticalPanel = new JPanel();40 verticalPanel.setLayout(new BoxLayout(verticalPanel, BoxLayout.Y_AXIS));41 verticalPanel.add(row1Panel);42 verticalPanel.add(row2Panel);43 verticalPanel.add(row3Panel);44 verticalPanel.add(row4Panel); 45 46 add(verticalPanel);47 setSize(250, 175);48 setLocationRelativeTo(null);49 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);50 setVisible(true);51 }52 53 public static void main(String args[]) {54 Test t = new Test();55 }5657 class ConcatenateAdapter implements ActionListener {65 public void actionPerformed(ActionEvent ae) {66 totalTF.setText(num1TF.getText() + num2TF.getText());67 }68 }69 }
Event-Driven Programming Example1 import java.awt.event.ActionEvent;2 import java.awt.event.ActionListener;34 import javax.swing.BoxLayout;5 import javax.swing.JButton;6 import javax.swing.JFrame;7 import javax.swing.JLabel;8 import javax.swing.JPanel;9 import javax.swing.JTextField;10 11 public class Test extends JFrame {12 private JTextField num1TF, num2TF, totalTF;13 private JLabel number1Label, number2Label;14 private JButton concatenateButton;15 public Test() {16 super("Event-Driven Programming Example");17 number1Label = new JLabel("Number 1");18 num1TF = new JTextField("", 15);19 number2Label = new JLabel("Number 2");20 num2TF = new JTextField("", 15);21 totalTF = new JTextField("", 20);22 concatenateButton = new JButton("Concatenate");23 class ConcatenateAdapter implements ActionListener {24 public void actionPerformed(ActionEvent ae) {25 Test.this.totalTF.setText(Test.this.num1TF.getText() + Test.this.num2TF.getText());26 }27 }28 concatenateButton.addActionListener(29 new ConcatenateAdapter());30
USC CSCI 201L 13/23Event-Driven Programming Example
31 JPanel row1Panel = new JPanel();32 row1Panel.add(number1Label);33 row1Panel.add(num1TF);3435 JPanel row2Panel = new JPanel();36 row2Panel.add(number2Label);37 row2Panel.add(num2TF);38 39 JPanel row3Panel = new JPanel();40 row3Panel.add(concatenateButton);4142 JPanel row4Panel = new JPanel();43 row4Panel.add(totalTF);44 JPanel verticalPanel = new JPanel();45 verticalPanel.setLayout(new BoxLayout(verticalPanel, BoxLayout.Y_AXIS));46 verticalPanel.add(row1Panel);47 verticalPanel.add(row2Panel);48 verticalPanel.add(row3Panel);49 verticalPanel.add(row4Panel); 50 51 add(verticalPanel);52 setSize(250, 175);53 setLocationRelativeTo(null);54 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);55 setVisible(true);56 }57 58 public static void main(String args[]) {59 Test t = new Test();60 }61 }
Event-Driven Programming Example1 import java.awt.event.ActionEvent;2 import java.awt.event.ActionListener;34 import javax.swing.BoxLayout;5 import javax.swing.JButton;6 import javax.swing.JFrame;7 import javax.swing.JLabel;8 import javax.swing.JPanel;9 import javax.swing.JTextField;10 11 public class Test extends JFrame {12 private JTextField num1TF, num2TF, totalTF;13 private JLabel number1Label, number2Label;14 private JButton concatenateButton;15 public Test() {16 super("Event-Driven Programming Example");17 number1Label = new JLabel("Number 1");18 num1TF = new JTextField("", 15);19 number2Label = new JLabel("Number 2");20 num2TF = new JTextField("", 15);21 totalTF = new JTextField("", 20);22 concatenateButton = new JButton("Concatenate");23 class ConcatenateAdapter implements ActionListener {24 public void actionPerformed(ActionEvent ae) {25 totalTF.setText(num1TF.getText() + num2TF.getText());26 }27 }28 concatenateButton.addActionListener(29 new ConcatenateAdapter());30
USC CSCI 201L 14/23Event-Driven Programming Example
31 JPanel row1Panel = new JPanel();32 row1Panel.add(number1Label);33 row1Panel.add(num1TF);3435 JPanel row2Panel = new JPanel();36 row2Panel.add(number2Label);37 row2Panel.add(num2TF);38 39 JPanel row3Panel = new JPanel();40 row3Panel.add(concatenateButton);4142 JPanel row4Panel = new JPanel();43 row4Panel.add(totalTF);44 JPanel verticalPanel = new JPanel();45 verticalPanel.setLayout(new BoxLayout(verticalPanel, BoxLayout.Y_AXIS));46 verticalPanel.add(row1Panel);47 verticalPanel.add(row2Panel);48 verticalPanel.add(row3Panel);49 verticalPanel.add(row4Panel); 50 51 add(verticalPanel);52 setSize(250, 175);53 setLocationRelativeTo(null);54 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);55 setVisible(true);56 }57 58 public static void main(String args[]) {59 Test t = new Test();60 }61 }
Event-Driven Programming Example1 import java.awt.event.ActionEvent;2 import java.awt.event.ActionListener;34 import javax.swing.BoxLayout;5 import javax.swing.JButton;6 import javax.swing.JFrame;7 import javax.swing.JLabel;8 import javax.swing.JPanel;9 import javax.swing.JTextField;10 11 public class Test extends JFrame {12 private JTextField num1TF, num2TF, totalTF;13 private JLabel number1Label, number2Label;14 private JButton concatenateButton;15 public Test() {16 super("Event-Driven Programming Example");17 number1Label = new JLabel("Number 1");18 num1TF = new JTextField("", 15);19 number2Label = new JLabel("Number 2");20 num2TF = new JTextField("", 15);21 totalTF = new JTextField("", 20);22 concatenateButton = new JButton("Concatenate");23 concatenateButton.addActionListener(new ActionListener() {24 public void actionPerformed(ActionEvent ae) {25 totalTF.setText(num1TF.getText() + num2TF.getText());26 }27 });28
USC CSCI 201L 15/23Event-Driven Programming Example
29 JPanel row1Panel = new JPanel();30 row1Panel.add(number1Label);31 row1Panel.add(num1TF);3233 JPanel row2Panel = new JPanel();34 row2Panel.add(number2Label);35 row2Panel.add(num2TF);36 37 JPanel row3Panel = new JPanel();38 row3Panel.add(concatenateButton);3940 JPanel row4Panel = new JPanel();41 row4Panel.add(totalTF);42 JPanel verticalPanel = new JPanel();43 verticalPanel.setLayout(new BoxLayout(verticalPanel, BoxLayout.Y_AXIS));44 verticalPanel.add(row1Panel);45 verticalPanel.add(row2Panel);46 verticalPanel.add(row3Panel);47 verticalPanel.add(row4Panel); 48 49 add(verticalPanel);50 setSize(250, 175);51 setLocationRelativeTo(null);52 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);53 setVisible(true);54 }55 56 public static void main(String args[]) {57 Test t = new Test();58 }59 }
Outline
USC CSCI 201L 16/23
▪ Event-Driven Programming Overview▪ Event-Driven Programming Example▪ Adapter Classes▪ Program
Listeners▪ The listeners are all interfaces, which means all of the methods in them
are abstract› Even if you only need one of the methods, you will still need to implement all
of them, though methods you don’t need would have empty bodies
USC CSCI 201L 17/23Adapter Classes
1 public class Test extends JFrame {2 public Test() {3 super("Event-Driven Programming Example");4 5 addWindowListener(new WindowListener() {6 public void windowDeiconified(WindowEvent we) {78 }9 public void windowIconified(WindowEvent we) {1011 }12 public void windowActivated(WindowEvent we) {1314 }15 public void windowDeactivated(WindowEvent we) {1617 }18 public void windowOpened(WindowEvent we) {19 System.out.println("opened");20 }21 public void windowClosing(WindowEvent we) {2223 }24 public void windowClosed(WindowEvent we) {25 System.out.println("closed");26 System.exit(1);27 }28 });
29 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);30 setSize(250, 175);31 setLocationRelativeTo(null);32 setVisible(true);33 }34 35 public static void main(String args[]) {36 Test t = new Test();37 }38 }
Adapters
▪ Java provides support classes, called adapters, which provide default implementations for all the methods in corresponding listener interfaces› The default implementation of a method is an empty body
with the method signature› Adapter only exist for interfaces that have more than one
method. Why?
USC CSCI 201L 18/23Adapter Classes
Adapter Classes
USC CSCI 201L 19/23Adapter Classes
Event Class Listener Interface Adapter Class Listener Methods
ActionEvent ActionListener actionPerformed(ActionEvent)
ItemEvent ItemListener itemStateChanged(ItemEvent)
MouseEventMouseListener MouseAdapter
mousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)
MouseMotionListener MouseMotionAdapter mouseDragged(MouseEvent)mouseMoved(MouseEvent)
KeyEvent KeyListener KeyAdapterkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)
WindowEvent WindowListener WindowAdapter
windowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)
ContainerEvent ContainerListener ContainerAdapter componentAdded(ContainerEvent)componentRemoved(ContainerEvent)
ComponentEvent ComponentListener ComponentAdapter
componentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)
FocusEvent FocusListener FocusAdapter focusGained(FocusEvent)focusLost(FocusEvent)
AdjustmentEvent AdjustmentListener adjustmentValueChanged(AdjustmentEvent)
ChangeEvent ChangeListener stateChanged(ChangeEvent)
ListSelectionEvent ListSelectionListener valueChanged(ListSelectionEvent)
Adapter Example▪ With an adapter, we only need to override the methods that we want to
use instead of all the methods in the listener
USC CSCI 201L 20/23Adapter Classes
1 public class Test extends JFrame {2 public Test() {3 super("Event-Driven Programming Example");4 5 addWindowListener(new WindowAdapter() {6 public void windowOpened(WindowEvent we) {7 System.out.println("opened");8 }9 public void windowClosed(WindowEvent we) {10 System.out.println("closed");11 System.exit(1);12 }13 });14 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);15 setSize(250, 175);16 setLocationRelativeTo(null);17 setVisible(true);18 }19 20 public static void main(String args[]) {21 Test t = new Test();22 }23 }
Outline
USC CSCI 201L 21/23
▪ Event-Driven Programming Overview▪ Event-Driven Programming Example▪ Adapter Classes▪ Program
Program
▪ Write a program that has three text fields for reading the loan amount, annual interest rate, and number of years from the user. When the user clicks the Calculate button or hits the Enter key, calculate the amount of the loan after the number of years assuming no money is paid to the principal. Print this value in a label.› KeyEvent has a method called getKeyChar()› KeyListener has a method called keyTyped(KeyEvent)
USC CSCI 201L 22/23Program
Program
▪ Write a program to concatenate two strings together from two text fields into a third text field when the Concatenate button is clicked.
USC CSCI 201L 23/23Program