在Java編程中,圖形用戶界面(GUI)是開發桌面應用程序的重要組成部分。通過GUI,用戶可以直觀地與程序進行交互,而無需通過命令行輸入。本文將詳細介紹如何使用Java的Swing庫來實現一個簡單的加法計算器。我們將從基本概念開始,逐步構建一個功能完整的加法計算器。
Swing是Java提供的一個用于創建圖形用戶界面的庫。它是Java Foundation Classes(JFC)的一部分,提供了豐富的組件和工具,用于構建跨平臺的桌面應用程序。Swing組件是輕量級的,不依賴于操作系統的原生窗口系統,因此可以在不同的平臺上保持一致的界面風格。
在實現加法計算器時,我們將使用以下Swing組件:
首先,我們需要創建一個主窗口來容納所有的GUI組件。我們可以通過繼承JFrame類來實現這一點。
import javax.swing.*;
public class Calculator extends JFrame {
public Calculator() {
setTitle("加法計算器");
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 居中顯示
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
Calculator calculator = new Calculator();
calculator.setVisible(true);
});
}
}
在上面的代碼中,我們創建了一個Calculator類,繼承自JFrame。在構造函數中,我們設置了窗口的標題、大小、關閉操作以及窗口居中顯示。main方法中使用SwingUtilities.invokeLater來確保GUI的創建和更新在事件調度線程中進行。
接下來,我們需要在窗口中添加兩個輸入框用于輸入數字,一個按鈕用于觸發加法操作,以及一個標簽用于顯示結果。
import javax.swing.*;
import java.awt.*;
public class Calculator extends JFrame {
private JTextField num1Field;
private JTextField num2Field;
private JLabel resultLabel;
public Calculator() {
setTitle("加法計算器");
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 居中顯示
// 創建面板
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(4, 2));
// 添加組件
panel.add(new JLabel("數字1:"));
num1Field = new JTextField();
panel.add(num1Field);
panel.add(new JLabel("數字2:"));
num2Field = new JTextField();
panel.add(num2Field);
JButton addButton = new JButton("計算");
panel.add(addButton);
resultLabel = new JLabel("結果:");
panel.add(resultLabel);
// 添加面板到窗口
add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
Calculator calculator = new Calculator();
calculator.setVisible(true);
});
}
}
在上面的代碼中,我們創建了一個JPanel面板,并使用GridLayout布局管理器將組件排列成4行2列的網格。我們添加了兩個JTextField用于輸入數字,一個JButton用于觸發加法操作,以及一個JLabel用于顯示結果。
現在,我們需要為“計算”按鈕添加事件監聽器,以便在用戶點擊按鈕時執行加法操作并顯示結果。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Calculator extends JFrame {
private JTextField num1Field;
private JTextField num2Field;
private JLabel resultLabel;
public Calculator() {
setTitle("加法計算器");
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 居中顯示
// 創建面板
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(4, 2));
// 添加組件
panel.add(new JLabel("數字1:"));
num1Field = new JTextField();
panel.add(num1Field);
panel.add(new JLabel("數字2:"));
num2Field = new JTextField();
panel.add(num2Field);
JButton addButton = new JButton("計算");
panel.add(addButton);
resultLabel = new JLabel("結果:");
panel.add(resultLabel);
// 添加事件監聽器
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
double num1 = Double.parseDouble(num1Field.getText());
double num2 = Double.parseDouble(num2Field.getText());
double result = num1 + num2;
resultLabel.setText("結果: " + result);
} catch (NumberFormatException ex) {
resultLabel.setText("結果: 輸入無效");
}
}
});
// 添加面板到窗口
add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
Calculator calculator = new Calculator();
calculator.setVisible(true);
});
}
}
在上面的代碼中,我們為“計算”按鈕添加了一個ActionListener,當用戶點擊按鈕時,程序會讀取兩個輸入框中的文本,將其轉換為double類型,執行加法操作,并將結果顯示在resultLabel中。如果輸入無效(例如輸入了非數字字符),程序會捕獲NumberFormatException并顯示錯誤信息。
為了進一步提升用戶體驗,我們可以添加一些額外的功能,例如:
我們可以為輸入框添加DocumentListener,在用戶輸入時實時驗證輸入內容是否為數字。
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Calculator extends JFrame {
private JTextField num1Field;
private JTextField num2Field;
private JLabel resultLabel;
public Calculator() {
setTitle("加法計算器");
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 居中顯示
// 創建面板
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(4, 2));
// 添加組件
panel.add(new JLabel("數字1:"));
num1Field = new JTextField();
panel.add(num1Field);
panel.add(new JLabel("數字2:"));
num2Field = new JTextField();
panel.add(num2Field);
JButton addButton = new JButton("計算");
panel.add(addButton);
resultLabel = new JLabel("結果:");
panel.add(resultLabel);
// 添加事件監聽器
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
double num1 = Double.parseDouble(num1Field.getText());
double num2 = Double.parseDouble(num2Field.getText());
double result = num1 + num2;
resultLabel.setText("結果: " + result);
} catch (NumberFormatException ex) {
resultLabel.setText("結果: 輸入無效");
}
}
});
// 添加輸入驗證
DocumentListener documentListener = new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
validateInput();
}
@Override
public void removeUpdate(DocumentEvent e) {
validateInput();
}
@Override
public void changedUpdate(DocumentEvent e) {
validateInput();
}
private void validateInput() {
try {
Double.parseDouble(num1Field.getText());
Double.parseDouble(num2Field.getText());
addButton.setEnabled(true);
} catch (NumberFormatException ex) {
addButton.setEnabled(false);
}
}
};
num1Field.getDocument().addDocumentListener(documentListener);
num2Field.getDocument().addDocumentListener(documentListener);
// 添加面板到窗口
add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
Calculator calculator = new Calculator();
calculator.setVisible(true);
});
}
}
在上面的代碼中,我們為輸入框添加了DocumentListener,當用戶輸入內容時,程序會實時驗證輸入是否為數字。如果輸入無效,計算按鈕將被禁用。
我們可以添加一個“清空”按鈕,用于清空輸入框和結果。
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Calculator extends JFrame {
private JTextField num1Field;
private JTextField num2Field;
private JLabel resultLabel;
public Calculator() {
setTitle("加法計算器");
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 居中顯示
// 創建面板
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(5, 2));
// 添加組件
panel.add(new JLabel("數字1:"));
num1Field = new JTextField();
panel.add(num1Field);
panel.add(new JLabel("數字2:"));
num2Field = new JTextField();
panel.add(num2Field);
JButton addButton = new JButton("計算");
panel.add(addButton);
JButton clearButton = new JButton("清空");
panel.add(clearButton);
resultLabel = new JLabel("結果:");
panel.add(resultLabel);
// 添加事件監聽器
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
double num1 = Double.parseDouble(num1Field.getText());
double num2 = Double.parseDouble(num2Field.getText());
double result = num1 + num2;
resultLabel.setText("結果: " + result);
} catch (NumberFormatException ex) {
resultLabel.setText("結果: 輸入無效");
}
}
});
clearButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
num1Field.setText("");
num2Field.setText("");
resultLabel.setText("結果:");
}
});
// 添加輸入驗證
DocumentListener documentListener = new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
validateInput();
}
@Override
public void removeUpdate(DocumentEvent e) {
validateInput();
}
@Override
public void changedUpdate(DocumentEvent e) {
validateInput();
}
private void validateInput() {
try {
Double.parseDouble(num1Field.getText());
Double.parseDouble(num2Field.getText());
addButton.setEnabled(true);
} catch (NumberFormatException ex) {
addButton.setEnabled(false);
}
}
};
num1Field.getDocument().addDocumentListener(documentListener);
num2Field.getDocument().addDocumentListener(documentListener);
// 添加面板到窗口
add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
Calculator calculator = new Calculator();
calculator.setVisible(true);
});
}
}
在上面的代碼中,我們添加了一個“清空”按鈕,并為其添加了ActionListener。當用戶點擊“清空”按鈕時,輸入框和結果將被清空。
我們可以為“計算”按鈕添加快捷鍵,例如按下Enter鍵時執行加法操作。
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
public class Calculator extends JFrame {
private JTextField num1Field;
private JTextField num2Field;
private JLabel resultLabel;
public Calculator() {
setTitle("加法計算器");
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 居中顯示
// 創建面板
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(5, 2));
// 添加組件
panel.add(new JLabel("數字1:"));
num1Field = new JTextField();
panel.add(num1Field);
panel.add(new JLabel("數字2:"));
num2Field = new JTextField();
panel.add(num2Field);
JButton addButton = new JButton("計算");
panel.add(addButton);
JButton clearButton = new JButton("清空");
panel.add(clearButton);
resultLabel = new JLabel("結果:");
panel.add(resultLabel);
// 添加事件監聽器
ActionListener addAction = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
double num1 = Double.parseDouble(num1Field.getText());
double num2 = Double.parseDouble(num2Field.getText());
double result = num1 + num2;
resultLabel.setText("結果: " + result);
} catch (NumberFormatException ex) {
resultLabel.setText("結果: 輸入無效");
}
}
};
addButton.addActionListener(addAction);
clearButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
num1Field.setText("");
num2Field.setText("");
resultLabel.setText("結果:");
}
});
// 添加快捷鍵
InputMap inputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = panel.getActionMap();
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "add");
actionMap.put("add", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
addAction.actionPerformed(e);
}
});
// 添加輸入驗證
DocumentListener documentListener = new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
validateInput();
}
@Override
public void removeUpdate(DocumentEvent e) {
validateInput();
}
@Override
public void changedUpdate(DocumentEvent e) {
validateInput();
}
private void validateInput() {
try {
Double.parseDouble(num1Field.getText());
Double.parseDouble(num2Field.getText());
addButton.setEnabled(true);
} catch (NumberFormatException ex) {
addButton.setEnabled(false);
}
}
};
num1Field.getDocument().addDocumentListener(documentListener);
num2Field.getDocument().addDocumentListener(documentListener);
// 添加面板到窗口
add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
Calculator calculator = new Calculator();
calculator.setVisible(true);
});
}
}
在上面的代碼中,我們為“計算”按鈕添加了Enter鍵的快捷鍵。當用戶在輸入框中按下Enter鍵時,程序會執行加法操作。
通過本文的介紹,我們學習了如何使用Java的Swing庫來實現一個簡單的加法計算器。我們從創建主窗口開始,逐步添加輸入框、按鈕和事件監聽器,最終實現了一個功能完整的加法計算器。我們還通過輸入驗證、清空按鈕和鍵盤快捷鍵等功能進一步優化了用戶體驗。
希望本文能夠幫助你理解Java GUI編程的基本概念,并激發你進一步探索和開發更復雜的桌面應用程序。如果你有任何問題或建議,歡迎在評論區留言討論。
以下是本文中實現的加法計算器的完整代碼:
”`java import javax.swing.; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent;
public class Calculator extends JFrame { private JTextField num1Field; private JTextField num2Field; private JLabel resultLabel;
public Calculator() {
setTitle("加法計算器");
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 居中顯示
// 創建面板
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(5, 2));
// 添加組件
panel.add(new JLabel("數字1:"));
num1Field = new JTextField();
panel.add(num1Field);
panel.add(new JLabel("數字2:"));
num2Field = new JTextField();
panel.add(num2Field);
JButton addButton = new JButton("計算");
panel.add(addButton);
JButton clearButton = new JButton("清空");
panel.add(clearButton);
resultLabel = new JLabel("結果:");
panel.add(resultLabel);
// 添加事件監聽器
ActionListener addAction = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
double num1 = Double.parseDouble(num1Field.getText());
double num2 = Double.parseDouble(num2Field.getText());
double result = num1 + num2;
resultLabel.setText("結果: " + result);
} catch (NumberFormatException ex) {
resultLabel.setText("結果: 輸入無效");
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。