gpt4 book ai didi

java - 如何知道 MVC View 中哪个字段要更新?

转载 作者:行者123 更新时间:2023-12-01 10:55:18 25 4
gpt4 key购买 nike

我正在开发一个使用 MVC 设计模式的 Java Swing 应用程序。主视图有一个与之关联的模型,程序逻辑在其中完成。通过 Setter 中的 setChanged() 和 NotifyObservers(),View 会收到通知。在View中,有一个方法的实现

public void update(Observable o, Object arg) 

处理 View 的更新。但是我如何在 update-Method 中知道要更新 View 中的哪个字段? o 是 Model 本身,arg 可以是 NotifyObservers(Object) 的参数。

但是假设我在模型中有三个 int 值,需要在 View 中显示。如果我比较

if (o.field1 == arg) {
...
} else if (o.field2 == arg) {
...
}

它不比较是否是字段,而是比较整数的值,因此开发者不知道要更新哪个字段。

所以我可以做两件事:

  1. 使用 Integer (不是 int),如果我想比较该值,我使用 .equals(Integer) 并将 Integer 对象提供给 NotifyChanged。但我必须记住,在模型中我必须与类的方法进行比较,而在程序的其他部分我必须通过 == 进行比较,所以我可能不知道要使用哪种方法。

  2. 将带有变量名称的字符串(可能是全局常量)传递给 NotifyChanged()。

正确和推荐的方法是什么?提前致谢。

最佳答案

当我创建 Swing MVC 应用程序时,我遵循 3 个简单的规则。

  • View 从模型中读取值。
  • View 不会更新模型。
  • Controller 更新模型并刷新/重新绘制 View 。

模型不知道 View 或 Controller 。

这是一个非常简单的 Swing 应用程序,它使用 MVC 模式。

enter image description here

Swing 应用程序生成 4 个随机数。每个数字都有一个与该数字相关的颜色。

DataModel 类定义数字/颜色值。 DisplayModel 类创建一个 DataModel 列表。该列表包含 4 个 DataModel 实例。

此列表已排序并传递到 View 。当您左键单击“新数字”按钮时,将生成一组新的 4 个数字/颜色并将其传递到 View 。

代码如下:

package com.ggl.testing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SortFrames implements Runnable {

private DisplayModel displayModel;

private JPanel[] panels;

private JLabel[] labels;

public SortFrames() {
this.displayModel = new DisplayModel();
}

@Override
public void run() {
List<DataModel> dataModels = displayModel.getDisplayModel();

JFrame frame = new JFrame("Sort Frames");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel mainPanel = new JPanel();

panels = new JPanel[dataModels.size()];
labels = new JLabel[dataModels.size()];

for (int i = 0; i < dataModels.size(); i++) {
DataModel dataModel = dataModels.get(i);
panels[i] = new JPanel();
panels[i].setBackground(dataModel.getBackgroundColor());
panels[i].setPreferredSize(new Dimension(30, 30));

labels[i] = new JLabel(getDisplayText(dataModel));
labels[i].setBackground(dataModel.getBackgroundColor());
labels[i].setForeground(dataModel.getForegroundColor());

panels[i].add(labels[i]);
mainPanel.add(panels[i]);
}

JPanel buttonPanel = new JPanel();

JButton submitButton = new JButton("New Numbers");
submitButton.addActionListener(new SubmitActionListener(displayModel,
this));

buttonPanel.add(submitButton);

frame.add(mainPanel, BorderLayout.CENTER);
frame.add(buttonPanel, BorderLayout.SOUTH);

frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
}

public void update() {
List<DataModel> dataModels = displayModel.getDisplayModel();

for (int i = 0; i < dataModels.size(); i++) {
DataModel dataModel = dataModels.get(i);

panels[i].setBackground(dataModel.getBackgroundColor());

labels[i].setBackground(dataModel.getBackgroundColor());
labels[i].setForeground(dataModel.getForegroundColor());
labels[i].setText(getDisplayText(dataModel));
}
}

private String getDisplayText(DataModel dataModel) {
if (dataModel.getNumber() == 12) {
return "-";
} else {
return Integer.toString(dataModel.getNumber());
}
}

public static void main(String args[]) {
SwingUtilities.invokeLater(new SortFrames());
}

public class DisplayModel {

private Random random;

private List<DataModel> displayModel;

public DisplayModel() {
this.displayModel = new ArrayList<>();
this.random = new Random();
createDisplayModel();
}

public void createDisplayModel() {
displayModel.clear();

for (int i = 0; i < 4; i++) {
int number = random.nextInt(13);
int colorNumber = random.nextInt(2);
Color backgroundColor = Color.BLACK;
Color foregroundColor = Color.WHITE;
if (colorNumber == 1) {
backgroundColor = Color.WHITE;
foregroundColor = Color.BLACK;
}
displayModel.add(new DataModel(number, colorNumber,
backgroundColor, foregroundColor));
}

Collections.sort(displayModel, new DataModelComparator());
}

public List<DataModel> getDisplayModel() {
return displayModel;
}

}

public class DataModel {
private final int number;
private final int colorNumber;

private final Color backgroundColor;
private final Color foregroundColor;

public DataModel(int number, int colorNumber, Color backgroundColor,
Color foregroundColor) {
this.number = number;
this.colorNumber = colorNumber;
this.backgroundColor = backgroundColor;
this.foregroundColor = foregroundColor;
}

public int getNumber() {
return number;
}

public int getColorNumber() {
return colorNumber;
}

public Color getBackgroundColor() {
return backgroundColor;
}

public Color getForegroundColor() {
return foregroundColor;
}

}

public class DataModelComparator implements Comparator<DataModel> {

@Override
public int compare(DataModel o1, DataModel o2) {
if (o1.getNumber() < o2.getNumber()) {
return -1;
} else if (o1.getNumber() > o2.getNumber()) {
return 1;
} else {
if (o1.getColorNumber() < o2.getColorNumber()) {
return -1;
} else if (o1.getColorNumber() > o2.getColorNumber()) {
return 1;
} else {
return 0;
}
}
}

}

public class SubmitActionListener implements ActionListener {

private DisplayModel displayModel;

private SortFrames sortFrames;

public SubmitActionListener(DisplayModel displayModel,
SortFrames sortFrames) {
this.displayModel = displayModel;
this.sortFrames = sortFrames;
}

@Override
public void actionPerformed(ActionEvent event) {
displayModel.createDisplayModel();
sortFrames.update();
}

}
}

关于java - 如何知道 MVC View 中哪个字段要更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33637768/

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