【问题标题】:Class Structure and Location for MVC in JavaJava中MVC的类结构和位置
【发布时间】:2023-03-16 18:11:01
【问题描述】:

我正在为数独程序编写 GUI。我正在尝试使用 MVC 框架。以下帖子是我当前大部分代码的基础: Building a GUI for a Sudoku Solver (Complete with ASCII Example)。我的问题是动作监听器去哪里了?我假设他们进入控制器,但它是一个类还是多个?我目前有一个带有单个动作侦听器和 if/else 逻辑的类来处理每个可以触发事件的摇摆组件。不过,这段代码对我来说很糟糕。有没有首选的方式来构建代码?我希望添加更多的按钮和组件,并且我想确保我正在做的路径是合理的。我已经阅读了很多帖子和网络教程,但还没有找到这个答案。

谢谢

public class SudokuView extends JFrame{
SudokuController controller;
//SudokuEngine sudokuEngine;

private static final int yMar = 100;
private static final int xMar = 25;
private static final int cellSize = 40;
private static final int gridSpace = 3;
private static final int secSpace = 9;
private static final int width = 2*xMar+9*cellSize+2*secSpace+6*gridSpace+10;
private static final int height = 650;

public JButton[][] gridButtons;

public SudokuView() {
    controller = new SudokuController();
    //sudokuEngine = new SudokuEngine();
    gridButtons = new JButton[9][9];
    setTitle("Sudoku Ninja 0.1");
    setSize(width, height);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(null);
    setBackground(Color.GRAY);
    setResizable(false);

    DrawBlankGrid();

    setVisible(true);
}

public void setSudokuImplementation(SudokuEngineInterface listener) {
    controller.setListener(listener);
}

public final void DrawBlankGrid(){
    int y=yMar;
    for (int r=0;r<9;r++){
        int x=xMar;
        for (int c=0;c<9;c++){
            gridButtons[r][c]=new JButton("");
            gridButtons[r][c].setBounds(x,y,cellSize,cellSize);
            gridButtons[r][c].putClientProperty("caller", 1);
            gridButtons[r][c].putClientProperty("column", c);
            gridButtons[r][c].putClientProperty("row", r);
            gridButtons[r][c].addActionListener(new SudokuController());
            add(gridButtons[r][c]);
            if (c==2||c==5){
                x = x+cellSize+secSpace;
            }else{
                x = x+cellSize+gridSpace;
            }
        }
        if (r==2||r==5){
            y = y+cellSize+secSpace;
        }else{
            y = y+cellSize+gridSpace;
        }
    }
}

public class SudokuController implements ActionListener{
SudokuEngineInterface listener;

public void setListener(SudokuEngineInterface listener) {
    this.listener = listener;
}

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() instanceof JButton){
        JButton gridButtons = (JButton) e.getSource();
        System.out.println("clicked column " + gridButtons.getClientProperty("column") + ", row " + gridButtons.getClientProperty("row"));
    }
}
}

public class RunSudokuNinja implements Runnable{

@Override
public void run() {
    //SudokuEngineInterface sudokuEngine = new SudokuEngine();
    SudokuView sudokuView = new SudokuView();
    //sudokuView.setSudokuImplementation(sudokuEngine);
    sudokuView.setVisible(true);
}


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

【问题讨论】:

  • 就个人而言,我会使用Action,它是用于特定操作的自包含控制器。
  • 我同意;并非每个 GUI 控件都需要通过 控制器 进行连接。比较引用的示例here。编辑:注意view 如何使用Action
  • 无关:不要对组件进行任何手动调整大小/定位,这是 LayoutManager 的专属任务

标签: java swing model-view-controller user-interface


【解决方案1】:

我知道了,http://leepoint.net/notes-java/GUI/structure/40mvc.html 非常有帮助。基本上是控制器中的内部类和视图中的 addListener 方法。这样组织得更好

【讨论】:

  • 令人惊讶的是,那些不是真正的 mvc 示例如何被一次又一次地引用:它缺少模型的一项重要职责,即通知其听众发生变化......
  • @kleopatra:my example 看起来好吗?欢迎任何批评/纠正。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多