
জাভা শেখার শুরুতে বেশিরভাগ সময় আমরা শুধু কনসোলে লেখা ছাপাই। কিন্তু নিজের হাতে বানানো একটা উইন্ডো, যেখানে বাটনে চাপ দিলে সত্যি সত্যি হিসাব হয়, সেটি দেখার আনন্দই আলাদা। ক্যালকুলেটর অ্যাপ বানানো এই জায়গায় সবচেয়ে ভালো প্রথম প্রজেক্ট, কারণ এতে একসাথে লেআউট, ইভেন্ট হ্যান্ডলিং, অবস্থা সংরক্ষণ আর এরর সামলানো, সবকিছুর চর্চা হয়ে যায়।
এই টিউনে আমরা Java Swing ব্যবহার করে একটি সম্পূর্ণ কাজ করা ক্যালকুলেটর তৈরি করব। কোনো বাড়তি লাইব্রেরি লাগবে না, শুধু JDK থাকলেই চলবে। প্রতিটি ধাপে কোডের সাথে ব্যাখ্যা থাকবে যাতে আপনি কেবল কপি না করে বুঝতে পারেন কোন লাইনটি কী করছে। শেষে সম্পূর্ণ কোড একসাথে দেওয়া থাকবে এবং কমন সমস্যাগুলোর সমাধানও থাকবে।
আমাদের ক্যালকুলেটরে উপরে থাকবে একটি ডিসপ্লে বক্স, আর নিচে চার সারি ও চার কলামে সাজানো ষোলোটি বাটন। যোগ, বিয়োগ, গুণ ও ভাগ কাজ করবে, C বাটনে সব মুছে যাবে, আর শূন্য দিয়ে ভাগ করতে চাইলে প্রোগ্রাম ভেঙে না গিয়ে বাংলায় বার্তা দেখাবে।
এডিটরে New Project থেকে একটি সাধারণ Java প্রজেক্ট খুলুন এবং src ফোল্ডারের ভেতরে Calculator নামে একটি ক্লাস তৈরি করুন। ফাইলের নাম আর পাবলিক ক্লাসের নাম হুবহু এক হতে হবে, নাহলে কম্পাইলার এরর দেবে।
কনস্ট্রাক্টরের ভেতরে উইন্ডোর মাপ, বন্ধ করার নিয়ম আর অবস্থান ঠিক করে নিচ্ছি। setLocationRelativeTo মেথডে null দিলে উইন্ডোটি স্ক্রিনের ঠিক মাঝখানে খোলে।
display.setEditable(false);
display.setHorizontalAlignment(JTextField.RIGHT);
display.setFont(new Font("Arial", Font.BOLD, 32));
display.setText("0");
add(display, BorderLayout.NORTH);এখানে একটি অ্যারেতে বাটনের লেখাগুলো রেখে লুপ চালিয়ে বাটন বানাচ্ছি। ষোলোটি বাটন হাতে হাতে লিখলে কোড অকারণে লম্বা হতো।
JPanel panel = new JPanel(new GridLayout(4, 4, 6, 6));
String[] labels = {"7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "C", "0", "=", "+"};
for (String label : labels) {JButton button = new JButton(label); button.setFont(new Font("Arial", Font.PLAIN, 22)); button.addActionListener(this); panel.add(button);}
add(panel, BorderLayout.CENTER);ক্যালকুলেটরের আসল বুদ্ধি এখানেই। ব্যবহারকারী সংখ্যা চাপলে সেটি ডিসপ্লেতে যোগ হবে, আর অপারেটর চাপলে আগের সংখ্যা আলাদা করে রেখে দিতে হবে।
@Override
public void actionPerformed(ActionEvent event) {String command = event.getActionCommand(); if ("0123456789".contains(command)) {if (startNew) {display.setText(command); startNew = false;} else {display.setText(display.getText() + command);} else if (command.equals("C")) {display.setText("0"); first = 0; operator = ""; startNew = true;} else if (command.equals("=")) {calculate();} else {first = Double.parseDouble(display.getText()); operator = command; startNew = true;}সমান চিহ্নে চাপ দিলে calculate মেথডটি চলবে। এখানে সবচেয়ে গুরুত্বপূর্ণ অংশ হলো ভাগের আগে ভাজক শূন্য কিনা যাচাই করা।
private void calculate() {double second = Double.parseDouble(display.getText()); double result; switch (operator) {case "+": result = first + second; break; case "-": result = first - second; break; case "*": result = first * second; break; case "/": if (second = 0) {display.setText("শূন্য দিয়ে ভাগ নয়"); startNew = true; return;} result = first / second; break; default: return;} display.setText(format(result)); startNew = true;}
private String format(double value) {if (value = Math.floor(value)) {return String.valueOf(long) value);} return String.valueOf(value);}জাভাতে double টাইপে হিসাব করলে দুই যোগ দুই এর ফল দেখায় 4.0 হিসেবে। format মেথডটি দেখে নেয় ফলটি পূর্ণসংখ্যা কিনা, হলে দশমিক অংশ বাদ দিয়ে দেখায়। এই ছোট কাজটুকু না করলে অ্যাপটি অপেশাদার দেখায়।
Swing এর সব কাজ Event Dispatch Thread নামের একটি বিশেষ থ্রেডে চালানোই নিয়ম। তাই main মেথডে সরাসরি উইন্ডো না খুলে invokeLater ব্যবহার করছি।
public static void main(String[] args) {SwingUtilities.invokeLater() -> {Calculator calculator = new Calculator(); calculator.setVisible(true);});}উপরের ধাপগুলো মিলিয়ে পুরো ফাইলটি নিচে দেওয়া হলো। Calculator.java নামে সেভ করে রান করলেই অ্যাপটি চালু হবে।
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Calculator extends JFrame implements ActionListener {private final JTextField display = new JTextField(); private double first = 0; private String operator = ""; private boolean startNew = true; public Calculator() {setTitle("সহজ ক্যালকুলেটর"); setSize(340, 420); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setLayout(new BorderLayout(8, 8)); display.setEditable(false); display.setHorizontalAlignment(JTextField.RIGHT); display.setFont(new Font("Arial", Font.BOLD, 32)); display.setText("0"); add(display, BorderLayout.NORTH); JPanel panel = new JPanel(new GridLayout(4, 4, 6, 6)); String[] labels = {"7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "C", "0", "=", "+"}; for (String label : labels) {JButton button = new JButton(label); button.setFont(new Font("Arial", Font.PLAIN, 22)); button.addActionListener(this); panel.add(button);} add(panel, BorderLayout.CENTER);} @Override public void actionPerformed(ActionEvent event) {String command = event.getActionCommand(); if ("0123456789".contains(command)) {if (startNew) {display.setText(command); startNew = false;} else {display.setText(display.getText() + command);} else if (command.equals("C")) {display.setText("0"); first = 0; operator = ""; startNew = true;} else if (command.equals("=")) {calculate();} else {first = Double.parseDouble(display.getText()); operator = command; startNew = true;} private void calculate() {double second = Double.parseDouble(display.getText()); double result; switch (operator) {case "+": result = first + second; break; case "-": result = first - second; break; case "*": result = first * second; break; case "/": if (second = 0) {display.setText("শূন্য দিয়ে ভাগ নয়"); startNew = true; return;} result = first / second; break; default: return;} display.setText(format(result)); startNew = true;} private String format(double value) {if (value = Math.floor(value)) {return String.valueOf(long) value);} return String.valueOf(value);} public static void main(String[] args) {SwingUtilities.invokeLater() -> {Calculator calculator = new Calculator(); calculator.setVisible(true);});}বেশিরভাগ ক্ষেত্রে প্যানেলটি ফ্রেমে যোগ করার আগেই setVisible ডাকা হয়ে গেছে। সব কম্পোনেন্ট যোগ করার পরে সবার শেষে উইন্ডো দৃশ্যমান করুন, অথবা যোগ করার পর revalidate মেথডটি ডাকুন।
প্রতিটি বাটনে addActionListener যোগ করা হয়েছে কিনা দেখুন। লুপের ভেতরে লাইনটি না থাকলে শুধু শেষ বাটনটি কাজ করবে, বাকিগুলো নীরব থাকবে।
যে ফন্ট ব্যবহার করছেন সেটিতে বাংলা অক্ষর নাও থাকতে পারে। Arial এর বদলে সিস্টেমে থাকা কোনো বাংলা ফন্টের নাম দিন, আর ফাইলটি অবশ্যই UTF 8 এনকোডিংয়ে সেভ করুন।
এই প্রজেক্টটি ছোট হলেও এর ভেতরে গ্রাফিক্যাল অ্যাপ বানানোর মূল কাঠামোটি পুরোটাই আছে। লেআউট দিয়ে সাজানো, ইভেন্ট ধরা, অবস্থা মনে রাখা আর ভুল ইনপুট সামলানো, এই চারটি কাজ শিখে গেলে যেকোনো ডেস্কটপ অ্যাপ বানানো আপনার কাছে সহজ মনে হবে।
কোড লেখা শেষ হলে নিজের মতো করে রঙ, ফন্ট আর বাটনের সাজ বদলে দেখুন। আপনি এই ক্যালকুলেটরে কোন বাড়তি সুবিধাটি যোগ করতে চান, টিউমেন্টে জানান। এখন নিজে একটি দশমিক বিন্দুর বাটন যোগ করার চেষ্টা করুন, তাতেই বুঝতে পারবেন শেখাটা কতটা পাকা হয়েছে।
আমি নাছিরুল হক। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 15 ঘন্টা 26 মিনিট যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 9 টি টিউন ও 0 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 0 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।