gpt4 book ai didi

java - 在Java中使用Swing正确实现GUI开发中的MVC模式

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:39:32 27 4
gpt4 key购买 nike

首先,我来自具有 MVC 的 PHP 背景,当我开始使用 PHP 时,我浏览了很多次,以尽我所能并在 PHP 中完善我的 MVC-Like 设计。很多人喜欢用答案来回答,这对我帮助很大。

但是在开始使用Swing进行GUI开发之后,关于Swing中MVC的答案就完全不同了。例如,一个模型也是一个 View ?根据Oracle's Suggestions TextElementModel 在这里没有任何逻辑业务,它所做的只是标记(设置颜色等)和设置数据,如设置文本等。当我用 PHP 开发时,没有 AbstractModel 这样的东西,因为我总是被告知模型不是类,或者更确切地说,它是处理逻辑业务的整个层。

在 PHP 中,我使用了服务、数据映射器和域对象,这是从这个对我在 PHP 中帮助很大的惊人答案中建议的:How should a model be structured in MVC?

我的尝试

再次阅读后,我想尝试一下,用 Java 做类似的事情:

我有创建所有 Controller 的 ControllerContainer:

public class ControllerContainer {

private JFrame frame;

public ControllerContainer(JFrame rune) {
this.frame = frame;
}

public void initControllers() {
Atest test = new Atest(frame);
test.registerView("test", new ViewTest(test));
}

}

如您所见,我将带有 ViewTest 实例的名为“test”的 View 添加到 Controller ,现在它将在框架中可见,并且可以接受输入。

我的Controller类,应该是抽象的,但我还没有把它抽象成:

public class Controller {

private JFrame frame;

private Map<String, Component> views = new HashMap<String, Component>();

public Controller(JFrame frame) {
this.frame = frame;
}

protected void registerView(String title, Component c) {
this.views.put(title, c);
this.frame.add(c);
}

protected void deregisterView(String title) {
this.frame.remove(this.views.get(title));
this.views.remove(title);
}

protected Component getView(String title) {
return this.views.get(title);
}
}

和一个测试 Controller :

public class Atest extends Controller {

public Atest(JFrame frame) {
super(frame);
}

public void hit() {
((ViewTest) super.getView("test")).changeColorBlue();
}
}

还有我的TestView:

public class ViewTest extends JPanel {

private final Atest controller;

public ViewTest(Atest c) {
this.controller = c;
setBackground(Color.RED);
setLocation(0,0);
setSize(300, 300);
setLayout(null);

JButton b = new JButton("hello");
b.setSize(150, 150);
b.setLocation(0,0);

b.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent arg0) {
controller.hit();
}
@Override
public void mouseEntered(MouseEvent arg0) {
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent arg0) {
}
@Override
public void mouseReleased(MouseEvent arg0) {
}
});

add(b);
}

public void changeColorBlue() {
setBackground(Color.BLUE);
}

}

问题

如您所见,我的 View 创建了一个新按钮,并为其添加了一个鼠标监听器。监听器将有权访问 Controller 以传递输入。 Controller 获取输入并更改 View 。

基本上 Controller 立即强制更新 View ,没有任何严肃的逻辑业务,因为在我的情况下不需要它。

根据我在上面发布的链接,由 tereško 回答,我如何才能正确地将他的想法和建议用于 Java Swing?

我真的很迷茫,PHP背景之后。

也许我误解了,一切都应该用不同的语言来做不同的事情?但我认为应该始终以相同的方式实现模式。

如果您需要更多信息,请告诉我。

最佳答案

MVC 模式是一种通用的范例,因此一般的编程语言之间没有区别。然而,实现和一些术语有时看起来不同。在 Java Swing 中,经常会看到以下两种方法:

<强>1。经典 MVC

Controller - 监听用户界面操作,执行相应的 Model 更新。可以从不同 View 聆听 Action 。

模型 - 表示状态和领域逻辑,修改状态的方法。通知监听器有关模型更新的信息(多个 View 可以监听更新)。 模型是独立的,对听众及其逻辑一无所知。

View - 负责用户界面、UI 元素布局,还监听模型更新并在需要时更新图形界面。对模型有一些了解,在下面显示的示例中,它知道如何处理“项目”列表。

一些简单的“待办事项”应用程序的设计可能如下所示:

enter image description here

<强>2。 MVP(模型 View 展示器)

Controller 充当ViewModel 之间的中介View 变得非常瘦,对 Model 一无所知,只与 Controller 交互。 Controller 监听ViewModel 并执行相应的操作。

enter image description here

Swing 本身增加了一些困惑,因为它的 UI 组件使用 MVC 模式。每个 UI 控件都有一个模型和 View 。它使设计新的 UI 组件变得更容易,但是在整个应用程序设计的“大局”中 - UI 控件保留在 View 层上。

关于java - 在Java中使用Swing正确实现GUI开发中的MVC模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25502552/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com