解释一下 Java 中 Java Swing 的架构?
awtjavaobject oriented programmingprogrammingswing
Java Swing 是一组 API,为 Java 程序提供图形用户界面 (GUI)。Java Swing 是基于早期的 API(称为 Abstract Windows Toolkit (AWT)开发的。Java Swing 提供了比 AWT 更丰富、更复杂的 GUI 组件。GUI 组件的范围从简单级别到复杂树和表。 Java Swing 提供可插入式外观,允许 Java 程序的外观与感觉独立于底层平台。
Java Swing 的功能
Java Swing 独立于平台,遵循 MVC(模型视图和控制器)框架。
- 可插入式外观 − Java Swing 支持多种可插入式外观,目前支持 Windows、UNIX、Motif 和本机 Java metal 外观,并允许用户在运行时切换外观,而无需重新启动应用程序。通过这种方式,用户可以立即做出自己的选择,选择最适合他们的外观和感觉。
- 轻量级组件 − 除某些 顶级容器 外,所有 Java Swing 组件都是 轻量级。轻量级 意味着组件使用 图形 对象的绘图基元来呈现或绘制自身,而不是依赖于主机操作系统 (OS)。因此,与以前的 Java GUI 应用程序(如 AWT)相比,应用程序呈现速度更快,消耗的内存更少。
- 简化的 MVC − Java Swing 使用简化的 模型-视图-控制器架构 (MVC) 作为其每个组件背后的核心设计,称为 模型委托。基于此架构,每个 Java Swing 组件包含一个 模型和一个 UI 委托,并在 MVC架构 中包装一个 视图和一个 控制器。UI 委托 负责绘制屏幕和处理 GUI 事件。模型负责维护组件的信息或状态。
示例
import javax.swing.*; import java.awt.*; import java.awt.event.*; // model part 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 partclass 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 part 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 contol() { actionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { linkBtnAndLabel(); } }; view.getButton().addActionListener(actionListener); } private void linkBtnAndLabel() { model.setX(); view.setText(Integer.toString(model.getX())); } } // main classpublic class Main { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { try { // Look and Feel, Java Look and Feel UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ex) { } Model model = new Model(0); View view = new View("-"); Controller controller = new Controller(model,view); controller.contol(); } }); } }