Java 在模型视图控制器中,为什么要在模型中更改,不';你不会触发视图中的更改吗?

Java 在模型视图控制器中,为什么要在模型中更改,不';你不会触发视图中的更改吗?,java,model-view-controller,swing,design-patterns,jdialog,Java,Model View Controller,Swing,Design Patterns,Jdialog,我目前正在开发自己的扫雷艇。Swing遵循模型-视图-控制器设计模式。在MVC中,我了解到每当模型发生变化时,控制器也会触发视图的变化。但在本例中,我无法跟踪如何在setTitle和setInfo中进行更改以反映在视图中 在这里,当我设置对话框的标题时,实际的内容(模型)正在更改,但输出(视图)中没有相应的更改 //InfoDisplayer是MenuActionListener类的内部类 类InfoDisplayer扩展JDialog{ JLabel信息; BorderLayout infoB

我目前正在开发自己的扫雷艇。Swing遵循模型-视图-控制器设计模式。在MVC中,我了解到每当模型发生变化时,控制器也会触发视图的变化。但在本例中,我无法跟踪如何在
setTitle
setInfo
中进行更改以反映在视图中

在这里,当我设置对话框的标题时,实际的内容(模型)正在更改,但输出(视图)中没有相应的更改

//InfoDisplayer是MenuActionListener类的内部类
类InfoDisplayer扩展JDialog{
JLabel信息;
BorderLayout infoBorderLayout=新建BorderLayout();
公共信息显示器(JFrame ownerFrame){
super(ownerFrame,true);
info=新的JLabel();
设置聚焦(假);
设置大小(300400);
setDefaultCloseOperation(在关闭时处理);
setLayout(infoBorderLayout);
添加(信息,BorderLayout.SOUTH);
setVisible(真);
}
无效设置信息(JLabel信息){
this.info=info;
}
公共无效集合标题(字符串标题){
超级标题(标题);
}                                   
}
如果((event.getActionCommand()).equals(“HowToPlay”)){
InfoDisplayer指令显示=新的InfoDisplayer(GUI管理器框架);
//gUIManagerFrame是其外类MenuActionListener的对象
说明Display.setTitle(“说明”);
指令Display.setInfo(新的JLabel(“指令”);
}否则{//如果单击了“关于”!!
InfoDisplayer aboutDisplay=新的InfoDisplayer(GUI管理器框架);
大约显示设置标题(“扫雷舰v0.1”);
关于display.setInfo(新的JLabel(“扫雷服务1.0”);
}           

您需要删除旧的jlabel并将新的添加到框架中


虽然在现有标签上设置文本比在一个全新的标签上设置文本更有意义。

您需要删除旧的jlabel并将新标签添加到框架中


尽管在现有标签上设置文本比在一个全新的标签上设置文本更有意义。

Swing确实有一个模型和一个视图面。例如,在JTable中,JTable是视图,TableModel是模型。构造JTable时,需要在构造期间或通过使用setter向其传递模型。然后,JTable将向模型添加一个侦听器,以了解任何模型更改。您可以将此侦听器视为控制器

然而,这并不意味着,当您使用任意组合的Swing类时,它们会自动神奇地了解彼此的更改。在您的情况下,标签肯定不是对话框的“模型”,在标签和对话框之间也没有“控制器”这样的东西。当您进行这样的更改时,您需要自己通知对话框(可能还需要将标签添加到对话框中)

哦,我建议将您的
setTitle
方法更改为

public void setTitle( String aTitle ){
    super.setTitle( aTittle );
}

或者完全移除它。这将避免StackOverflowException

Swing确实有一个模型和一个视图侧。例如,在JTable中,JTable是视图,TableModel是模型。构造JTable时,需要在构造期间或通过使用setter向其传递模型。然后,JTable将向模型添加一个侦听器,以了解任何模型更改。您可以将此侦听器视为控制器

然而,这并不意味着,当您使用任意组合的Swing类时,它们会自动神奇地了解彼此的更改。在您的情况下,标签肯定不是对话框的“模型”,在标签和对话框之间也没有“控制器”这样的东西。当您进行这样的更改时,您需要自己通知对话框(可能还需要将标签添加到对话框中)

哦,我建议将您的
setTitle
方法更改为

public void setTitle( String aTitle ){
    super.setTitle( aTittle );
}
或者完全移除它。这将避免StackOverflowException

当模型发生变化时,控制器将触发视图中的变化

在中,当控制器更新模型时,模型将通知视图(通常使用),然后视图将更新自身。视图可以查询模型并处理任何结果更新。这里有一个更详细的答案和例子

当模型发生变化时,控制器将触发视图中的变化


在中,当控制器更新模型时,模型将通知视图(通常使用),然后视图将更新自身。视图可以查询模型并处理任何结果更新。这里有一个更详细的答案和示例。

两种方法都不起作用。您将如何删除旧的JLabel并添加新的JLabel?第一个:“void setInfo(JLabel info){remove(this.info);this.info.setText(info.toString());add(this.info,BorderLayout.SOUTH);}”第二个:“void setInfo(JLabel info){remove(this.info);this.info=info;add(info,BorderLayout.SOUTH);}”+1表示更新超过替换;更多关于MVC的内容。这两种方法都不起作用。您将如何删除旧的JLabel并添加新的JLabel?第一个:“void setInfo(JLabel info){remove(this.info);this.info.setText(info.toString());add(this.info,BorderLayout.SOUTH);}”第二个:“void setInfo(JLabel info){remove(this.info);this.info=info;add(info,BorderLayout.SOUTH);}”+1表示更新超过替换;有关MVC的更多信息。很抱歉忘记也更改为super.setTitleSee。很抱歉也忘记更改为super.setTitleSee。