Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

สถาปัตยกรรมของ Java Swing คืออย่างไร?

Java Swing เป็นชุด API ที่ให้ส่วนติดต่อผู้ใช้แบบกราฟิก (GUI) สำหรับโปรแกรม Java พัฒนาจาก API เก่าชื่อ Abstract Windows Toolkit (AWT) Swing ให้คอมโพเนนต์ GUI ที่ทันสมัยและซับซ้อนกว่า AWT ตั้งแต่ระดับง่ายจนถึง Tree และ Table รองรับ Pluggable Look and Feel ทำให้รูปลักษณ์โปรแกรมอิสระจากแพลตฟอร์ม

คุณสมบัติหลักของ Java Swing

Swing เป็นอิสระแพลตฟอร์มและปฏิบัติตามกรอบงาน MVC (Model-View-Controller)

  • Pluggable Look and Feel - รองรับหลายรูปลักษณ์: Windows, UNIX, Motif, และ Metal (Java เริ่มต้น) สลับได้ระหว่างรันไทม์โดยไม่ต้องรีสตาร์ท
  • Lightweight Components - คอมโพเนนต์ทุกตัวเป็นแบบเบา (lightweight) ยกเว้นคอนเทนเนอร์ระดับบนสุด รีเซิร์นเองด้วย Graphics object ไม่พึ่ง OS ทำให้เร็วกว่าและใช้หน่วยความจำน้อยกว่า AWT
  • Simplified MVC (Model-Delegate) - ใช้ MVC แบบง่ายเรียกว่า Model-Delegate แต่ละคอมโพเนนต์มี Model (เก็บสถานะ/ข้อมูล) และ UI Delegate (วาดหน้าจอและจัดการเหตุการณ์) รวม View และ Controller ไว้ด้วยกัน

ตัวอย่างการนำ MVC ไปใช้

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

// Model
class Model {
    private int x;
    public Model() { x = 0; }
    public Model(int x) { this.x = x; }
    public void setX() { x++; }
    public int getX() { return x; }
}

// View
class View {
    private JFrame frame;
    private JLabel label;
    private JButton button;
    public View(String text) {
        frame = new JFrame("View");
        frame.getContentPane().setLayout(new BorderLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setVisible(true);
        label = new JLabel(text);
        frame.getContentPane().add(label, BorderLayout.CENTER);
        button = new JButton("Button");
        frame.getContentPane().add(button, BorderLayout.SOUTH);
    }
    public JButton getButton() { return button; }
    public void setText(String text) { label.setText(text); }
}

// Controller
class Controller {
    private Model model;
    private View view;
    private ActionListener actionListener;
    public Controller(Model model, View view) {
        this.model = model;
        this.view = view;
    }
    public void control() {
        actionListener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                linkBtnAndLabel();
            }
        };
        view.getButton().addActionListener(actionListener);
    }
    private void linkBtnAndLabel() {
        model.setX();
        view.setText(Integer.toString(model.getX()));
    }
}

// Main
public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) { }
                Model model = new Model(0);
                View view = new View("-");
                Controller controller = new Controller(model, view);
                controller.control();
            }
        });
    }
}

ผลลัพธ์

หน้าต่าง GUI แสดงตัวเลขนับขึ้นทุกครั้งที่กดปุ่ม แสดงการแยก Model, View, Controller ชัดเจน