1.
Sum of Two Numbers Using Swing Components with Key
Adapter
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class SumWithKeyAdapter extends JFrame {
private JTextField num1Field, num2Field, resultField;
public SumWithKeyAdapter() {
setTitle("Sum Calculator");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(4, 2));
add(new JLabel("First Number:"));
num1Field = new JTextField();
add(num1Field);
add(new JLabel("Second Number:"));
num2Field = new JTextField();
add(num2Field);
add(new JLabel("Result:"));
resultField = new JTextField();
resultField.setEditable(false);
add(resultField);
// Add key listener to both input fields
KeyAdapter keyAdapter = new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
try {
double num1 = Double.parseDouble(num1Field.getText());
double num2 = Double.parseDouble(num2Field.getText());
double sum = num1 + num2;
resultField.setText(String.valueOf(sum));
} catch (NumberFormatException ex) {
resultField.setText("Invalid input");
}
}
};
num1Field.addKeyListener(keyAdapter);
num2Field.addKeyListener(keyAdapter);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new SumWithKeyAdapter());
}
}
2. JDBC Architecture and Drivers
JDBC Architecture Diagram:
JDBC Components:
1. Application: Java program that uses JDBC API
2. JDBC API: Provides interfaces and classes (DriverManager, Connection, Statement, ResultSet)
3. JDBC Driver: Translates API calls to database-specific calls
4. Database: The actual RDBMS (MySQL, Oracle, etc.)
Types of JDBC Drivers:
1. Type 1: JDBC-ODBC Bridge Driver
o Converts JDBC calls to ODBC calls
o Requires ODBC to be installed on client machine
o Slow performance due to multiple layers
o Deprecated in Java 8
2. Type 2: Native API Driver (Partly Java Driver)
o Uses client-side libraries of the database
o Converts JDBC calls to native API calls
o Better performance than Type 1 but requires native libraries
3. Type 3: Network Protocol Driver (Pure Java Driver)
o Uses middleware (application server) to connect to database
o JDBC calls are translated to middleware protocol
o No client-side database software needed
4. Type 4: Thin Driver (Pure Java Driver)
o Directly converts JDBC calls to vendor-specific protocol
o No additional software needed on client or server
o Best performance and most commonly used
3. Swing Program to Add Two Numbers (Key Press)
java
Copy
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class AddNumbersSwing extends JFrame {
private JTextField num1Field, num2Field, resultField;
public AddNumbersSwing() {
setTitle("Addition Program");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(4, 2));
add(new JLabel("First Number:"));
num1Field = new JTextField();
add(num1Field);
add(new JLabel("Second Number:"));
num2Field = new JTextField();
add(num2Field);
add(new JLabel("Result:"));
resultField = new JTextField();
resultField.setEditable(false);
add(resultField);
// Add key listener to both input fields
KeyAdapter keyAdapter = new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
try {
double num1 = Double.parseDouble(num1Field.getText());
double num2 = Double.parseDouble(num2Field.getText());
resultField.setText(String.valueOf(num1 + num2));
} catch (NumberFormatException ex) {
resultField.setText("Invalid input");
}
}
};
num1Field.addKeyListener(keyAdapter);
num2Field.addKeyListener(keyAdapter);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new AddNumbersSwing());
}
}
4. Student Information Table Using Swing
java
Copy
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class StudentInfoTable extends JFrame {
private JTextField symbolField, nameField;
private DefaultTableModel tableModel;
private JTable table;
public StudentInfoTable() {
setTitle("Student Information");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// Input panel
JPanel inputPanel = new JPanel(new GridLayout(2, 2));
inputPanel.add(new JLabel("Symbol Number:"));
symbolField = new JTextField();
inputPanel.add(symbolField);
inputPanel.add(new JLabel("First Name:"));
nameField = new JTextField();
inputPanel.add(nameField);
add(inputPanel, BorderLayout.NORTH);
// Table
tableModel = new DefaultTableModel();
tableModel.addColumn("Symbol Number");
tableModel.addColumn("First Name");
table = new JTable(tableModel);
add(new JScrollPane(table), BorderLayout.CENTER);
// Add button
JButton addButton = new JButton("Add Student");
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String symbol = symbolField.getText();
String name = nameField.getText();
if (!symbol.isEmpty() && !name.isEmpty()) {
tableModel.addRow(new Object[]{symbol, name});
symbolField.setText("");
nameField.setText("");
}
}
});
add(addButton, BorderLayout.SOUTH);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new StudentInfoTable());
}
}
5. MVC Design Pattern with Example
MVC (Model-View-Controller) Architecture:
1. Model: Represents data and business logic
2. View: Displays the data (UI components)
3. Controller: Handles user input and updates model/view
Example: Student Management System
java
Copy
// Model
public class Student {
private String rollNo;
private String name;
public String getRollNo() { return rollNo; }
public void setRollNo(String rollNo) { this.rollNo = rollNo; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
// View
public class StudentView {
public void printStudentDetails(String rollNo, String name) {
System.out.println("Student:");
System.out.println("Roll No: " + rollNo);
System.out.println("Name: " + name);
}
}
// Controller
public class StudentController {
private Student model;
private StudentView view;
public StudentController(Student model, StudentView view) {
this.model = model;
this.view = view;
}
public void setStudentName(String name) {
model.setName(name);
}
public String getStudentName() {
return model.getName();
}
public void setStudentRollNo(String rollNo) {
model.setRollNo(rollNo);
}
public String getStudentRollNo() {
return model.getRollNo();
}
public void updateView() {
view.printStudentDetails(model.getRollNo(), model.getName());
}
}
// Usage
public class MVCPatternDemo {
public static void main(String[] args) {
// Create model
Student student = new Student();
student.setRollNo("101");
student.setName("John Doe");
// Create view
StudentView view = new StudentView();
// Create controller
StudentController controller = new StudentController(student, view);
// Update view
controller.updateView();
// Update model
controller.setStudentName("Jane Smith");
controller.updateView();
}
}
6. Layout Managers in GUI Design
Role of Layout Managers:
• Automatically arrange components in a container
• Handle component positioning and resizing
• Make GUIs look consistent across different platforms
Comparison:
Layout
Description When to Use
Manager
Simple forms with
Arranges components in a row,
FlowLayout components in a single
wrapping to next row if needed
row/column
Layout
Description When to Use
Manager
Divides container into five regions
Main application frames with
BorderLayout (NORTH, SOUTH, EAST, WEST,
header, footer, sidebar
CENTER)
Forms with components
GridLayout Creates a grid with equal-sized cells
arranged in a strict grid
Example:
java
Cop
JFrame frame = new JFrame("Layout Demo");
frame.setLayout(new BorderLayout());
JPanel northPanel = new JPanel(new FlowLayout());
northPanel.add(new JButton("North"));
frame.add(northPanel, BorderLayout.NORTH);
JPanel centerPanel = new JPanel(new GridLayout(2, 2));
centerPanel.add(new JButton("1"));
centerPanel.add(new JButton("2"));
centerPanel.add(new JButton("3"));
centerPanel.add(new JButton("4"));
frame.add(centerPanel, BorderLayout.CENTER);
frame.add(new JButton("South"), BorderLayout.SOUTH);
7. Exception Handling in GUI Applications
Best Practices:
• Use try-catch blocks for operations that might fail
• Show user-friendly error messages
• Log technical details for debugging
• Validate input before processing
Example with Error Handling:
java
Copy
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DivisionCalculator extends JFrame {
private JTextField num1Field, num2Field, resultField;
public DivisionCalculator() {
setTitle("Division Calculator");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(4, 2));
add(new JLabel("Numerator:"));
num1Field = new JTextField();
add(num1Field);
add(new JLabel("Denominator:"));
num2Field = new JTextField();
add(num2Field);
add(new JLabel("Result:"));
resultField = new JTextField();
resultField.setEditable(false);
add(resultField);
JButton calculateButton = new JButton("Calculate");
calculateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
double numerator = Double.parseDouble(num1Field.getText()
);
double denominator = Double.parseDouble(num2Field.getText
());
if (denominator == 0) {
throw new ArithmeticException("Cannot divide by zero"
);
}
double result = numerator / denominator;
resultField.setText(String.format("%.2f", result));
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(DivisionCalculator.this,
"Please enter valid numbers",
"Input Error",
JOptionPane.ERROR_MESSAGE);
} catch (ArithmeticException ex) {
JOptionPane.showMessageDialog(DivisionCalculator.this,
ex.getMessage(),
"Math Error",
JOptionPane.ERROR_MESSAGE);
}
}
});
add(calculateButton);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new DivisionCalculator());
}
}
8. AWT vs Swing Components
Differences:
Feature AWT Swing
Package java.awt javax.swing
Native Peer Heavyweight (uses OS widgets) Lightweight (paints own widgets)
Look & Feel Platform-dependent Pluggable look & feel
Components Limited set Rich set (tables, trees, etc.)
Performance Faster for simple apps Slower but more features
Extensibility Limited Highly extensible
Why Swing is Lightweight:
• Swing components are written entirely in Java
• They don't rely on native peer components from the OS
• Swing paints its own components using Java 2D graphics
• This makes Swing more portable and consistent across platforms
• Lightweight components are easier to customize and extend
9. Simple Calculator Using AWT
import java.awt.*;
import java.awt.event.*;
public class AWTCalculator extends Frame {
private TextField display;
private double firstNumber, secondNumber;
private String operation;
public AWTCalculator() {
setTitle("AWT Calculator");
setSize(300, 400);
setLayout(new BorderLayout());
// Display
display = new TextField();
display.setEditable(false);
add(display, BorderLayout.NORTH);
// Buttons
Panel buttonPanel = new Panel(new GridLayout(4, 4));
String[] buttons = {
"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
"C", "0", "=", "+"
};
for (String text : buttons) {
Button button = new Button(text);
button.addActionListener(new ButtonClickListener());
buttonPanel.add(button);
}
add(buttonPanel, BorderLayout.CENTER);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
}
});
setVisible(true);
}
private class ButtonClickListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
switch (command) {
case "0": case "1": case "2": case "3":
case "4": case "5": case "6": case "7":
case "8": case "9":
display.setText(display.getText() + command);
break;
case "+": case "-": case "*": case "/":
firstNumber = Double.parseDouble(display.getText());
operation = command;
display.setText("");
break;
case "=":
secondNumber = Double.parseDouble(display.getText());
double result = calculate();
display.setText(String.valueOf(result));
break;
case "C":
display.setText("");
firstNumber = secondNumber = 0;
operation = null;
break;
}
}
private double calculate() {
switch (operation) {
case "+": return firstNumber + secondNumber;
case "-": return firstNumber - secondNumber;
case "*": return firstNumber * secondNumber;
case "/": return firstNumber / secondNumber;
default: return 0;
}
}
}
public static void main(String[] args) {
new AWTCalculator();
}
}