В Model-View-Controller, Почему изменение в модели не вызывает изменения в представлении? - PullRequest
1 голос
/ 06 декабря 2011

Я сейчас занимаюсь разработкой собственного тральщика. Swing следует шаблону проектирования Model-View-Controller. В MVC я узнал всякий раз, когда происходит изменение в модели, контроллер также запускает это изменение в представлении . Но в этом примере я не могу проследить, как внести изменения в setTitle и setInfo, чтобы они отражались в представлении.

Здесь, когда я устанавливаю заголовок диалогового окна, фактическое содержимое (модель) изменяется, но нет соответствующего изменения в выводе (представление).

//InfoDisplayer is inner class of class MenuActionListener
class InfoDisplayer extends JDialog { 
    JLabel info;
    BorderLayout infoBorderLayout = new BorderLayout();

    public InfoDisplayer(JFrame ownerFrame) {
        super(ownerFrame,true); 
        info = new JLabel();
        setFocusable(false);                        
        setSize(300,400);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setLayout(infoBorderLayout);
        add(info,BorderLayout.SOUTH);
        setVisible(true);
    }

    void setInfo(JLabel info) {
        this.info = info;
    }

    public void setTitle(String title) {
        super.setTitle(title);
    }                                   
}

if ((event.getActionCommand()).equals("HowToPlay")) {
    InfoDisplayer instructionsDisplay = new InfoDisplayer(gUIManagerFrame); 
    //gUIManagerFrame is an object of its outer class,MenuActionListener
    instructionsDisplay.setTitle("INSTRUCTIONS");
    instructionsDisplay.setInfo(new JLabel("<html><h1><B>INSTRUCTIONS</B></h1></html>"));
} else {// if about is clicked!!
    InfoDisplayer aboutDisplay = new InfoDisplayer(gUIManagerFrame);
    aboutDisplay.setTitle("MineSweeper v0.1");
    aboutDisplay.setInfo(new JLabel("<html><h1><B>MineSweeperv1.0</B></h1> </html>"));
}           

Ответы [ 3 ]

3 голосов
/ 06 декабря 2011

Всякий раз, когда происходит изменение в модели , контроллер запускает это изменение в представлении .

В шаблоне Модель – Вид – Контроллер , когда контроллер обновляет модель , модель уведомит view , обычно с использованием шаблона наблюдателя , и view затем обновляется. view может запросить модель и обработать любое полученное обновление. Более подробный ответ и пример здесь .

1 голос
/ 06 декабря 2011

У свинга действительно есть модель и вид сбоку. Например, в JTable JTable - это представление, а TableModel - это модель. Когда вы создаете JTable, вам нужно передать ему модель либо во время построения, либо с помощью установщика. Затем JTable добавит слушателя в модель, чтобы получать информацию о любых изменениях модели. Вы можете видеть этот слушатель как контроллер.

Однако это не означает, что когда вы используете произвольную комбинацию классов Swing, они автоматически получают информацию об изменениях друг друга. В вашем случае, ярлык, безусловно, не является «моделью» вашего диалога, и между «ярлыком» и диалогом нет такой вещи, как «контроллер». Когда вы вносите такое изменение, вам нужно сообщить диалоговое окно самостоятельно (и, возможно, также добавить метку к вашему диалогу).

О, и я бы порекомендовал изменить ваш setTitle метод на

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

или удалите его полностью. Это позволит избежать StackOverflowException

1 голос
/ 06 декабря 2011

Вам нужно будет удалить старую метку и добавить новую в рамку.

Хотя было бы более целесообразно установить текст на существующей метке, а не на новую метку.

...