首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单Java (swing)

简单Java (swing)
EN

Code Review用户
提问于 2018-07-21 23:06:09
回答 2查看 613关注 0票数 1

我是一个Java初学者,目前正在练习MVC模式,并想出了这个方法。请您检查一下,这是否是MVC的一个适当的实现,以及是否有任何最佳实践,我已经打破了?

代码语言:javascript
复制
public class Appka {

    public static void main(String[] args) {

        Model model = new Model();        
        Controller controller = new Controller(model);              
        View view = new View(model, controller);        
        model.addListener(view);

    }
}


public class Model {

    String value;
    List<StateChangedListener> listeners = new ArrayList<>();

    public Model() {

        this.value = "";
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
        notifyListeners();
    }

    public void addListener(StateChangedListener l) {
        listeners.add(l);
    }

    public void removeListener(StateChangedListener l) {
        listeners.remove(l);
    }

    public void notifyListeners() {
        listeners.forEach(l -> l.stateChanged());
    }
}


public class View extends JFrame implements StateChangedListener {

    private Model model;
    private Controller controller;
    private JLabel label1;
    private JLabel label2;
    private JButton button1;     
    private JButton button2; 

    public View(Model model, Controller controller) {
        this.model = model;
        this.controller = controller;
        initComponents();
    }


    private void initComponents() {

        button1 = new JButton();
        button2 = new JButton();
        label1 = new JLabel();
        label2 = new JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        button1.setText("1");
        button1.addActionListener(controller);


        button2.setText("2");
        button2.addActionListener(controller);

        label1.setText("label1");

        label2.setText("label2");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(button1)
                    .addComponent(label1))
                .addGap(26, 26, 26)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(label2)
                    .addComponent(button2))
                .addContainerGap(113, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(24, 24, 24)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(label1)
                    .addComponent(label2))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(button1)
                    .addComponent(button2))
                .addContainerGap(30, Short.MAX_VALUE))
        );

        pack();
        setVisible(true);

    }


    @Override
    public void stateChanged() {
        label1.setText(model.getValue());
        label2.setText(model.getValue());
    }

}

public class Controller implements ActionListener {

    private Model model;

    public Controller(Model model) {
        this.model = model;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton clicked = (JButton) e.getSource();
        model.setValue(clicked.getText());        
    }

}

interface StateChangedListener {

    public void stateChanged();

}
EN

回答 2

Code Review用户

发布于 2018-07-23 17:30:00

(这个答案是建议而不是真正的代码评审,但我不能评论)

我不赞成在GUI中使用swing。Java正在用JavaFX代替swing。但这并不是我应该使用JavaFX的唯一原因。最重要的原因是,使用JavaFX更容易遵循MVC模式。

我推荐了一个非常好的JavaFx和MVC教程,它展示了整个工作流程和结构:链接

票数 1
EN

Code Review用户

发布于 2018-07-23 13:59:54

有几个问题:

  1. 您将按钮而不是文本字段连接到您的模型。
  2. 您有两个文本字段,但模型中只有一个值。在适当的MVC中,每个文本字段都应该附加到模型的不同属性上。
  3. 您总是发送更改事件。只有在新值与旧值不相同时,模型才会发送更改事件。
  4. 您应该告诉您的StateChangedListener,模型的哪个方面发生了变化。例如,传递属性的名称。
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/200012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档