2
\$\begingroup\$

I will be implementing MVC model in my program but before that, I have done a simple program based on my understanding of the MVC model.

I have three pages:

  • The user will enter a value in page one and click the next button.
  • The value will be printed in page two and a picture will be displayed.
  • page three is the end of the page.

Two questions I would like to ask:

  • Is my MVC implementation correct?
  • There are repeated swing components such as JPanel topPanel, JPanel centerPanel, JPanel bottomPanel in PageOne.java, PageTwo.java and PageThree.java and JButton nextButton, JButton cancelButton in PageOne.java, PageTwo.java. Is it ok to repeat component like this for every class? or is there a better way to initialize the component once and use for different classes?

View

PageOne.java

package View;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class PageOne extends JPanel{

    private JPanel topPanel;
    private JPanel centerPanel;
    private JPanel bottomPanel;
    private JLabel pageOneLabel;
    private JLabel valueLabel;
    private JTextField textField;
    private JButton nextButton;
    private JButton cancelButton;

    public PageOne() {
        setLayout(new BorderLayout());

        pageOneLabel = new JLabel("Page One");
        valueLabel = new JLabel("Enter a value");
        textField = new JTextField(15);
        nextButton = new JButton("Next");
        cancelButton = new JButton("Cancel");

        topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        centerPanel = new JPanel(new FlowLayout());
        bottomPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));

        topPanel.setBackground(Color.WHITE);
        topPanel.add(pageOneLabel);

        centerPanel.add(valueLabel);
        centerPanel.add(textField);

        bottomPanel.add(nextButton);
        bottomPanel.add(cancelButton);

        add(topPanel, BorderLayout.NORTH);
        add(centerPanel, BorderLayout.CENTER);
        add(bottomPanel, BorderLayout.SOUTH);
    }

    public void nextButtonListener(ActionListener listener) {
        nextButton.addActionListener(listener);
    }

    public void cancelButtonListener(ActionListener listener) {
        cancelButton.addActionListener(listener);
    }

    public String textFieldValue() {
        return textField.getText();
    }
}

PageTwo.java

package View;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

import Model.PageTwoModel;

@SuppressWarnings("serial")
public class PageTwo extends JPanel{

    private JPanel topPanel;
    private JPanel centerPanel;
    private JPanel bottomPanel;
    private JLabel pageTwoLabel;
    private JLabel valueLabel;
    private JLabel pic;
    private JButton nextButton;
    private JButton cancelButton;

    public PageTwo(PageTwoModel pageTwoModel) {
        setLayout(new BorderLayout());

        pageTwoLabel = new JLabel("Page Two");
        pic = new JLabel((new ImageIcon(pageTwoModel.getImage())));
        valueLabel = new JLabel();
        nextButton = new JButton("Next");
        cancelButton = new JButton("Cancel");

        topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        centerPanel = new JPanel(new FlowLayout());
        bottomPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));

        topPanel.setBackground(Color.WHITE);
        topPanel.add(pageTwoLabel);

        centerPanel.add(pic);
        centerPanel.add(valueLabel);

        bottomPanel.add(nextButton);
        bottomPanel.add(cancelButton);

        add(topPanel, BorderLayout.NORTH);
        add(centerPanel, BorderLayout.CENTER);
        add(bottomPanel, BorderLayout.SOUTH);
    }

    public void nextButtonListener(ActionListener listener) {
        nextButton.addActionListener(listener);
    }

    public void cancelButtonListener(ActionListener listener) {
        cancelButton.addActionListener(listener);
    }

    public void setLabelValue(String s) {
        valueLabel.setText(s);
    }
}

PageThree.java

package View;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class PageThree extends JPanel{

    private JPanel topPanel;
    private JPanel centerPanel;
    private JPanel bottomPanel;
    private JLabel pageThreeLabel;
    private JLabel valueLabel;
    private JButton closeButton;

    public PageThree() {
        setLayout(new BorderLayout());

        pageThreeLabel = new JLabel("Page Three");
        valueLabel = new JLabel("End of Page");
        closeButton = new JButton("Close");

        topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        centerPanel = new JPanel(new FlowLayout());
        bottomPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));

        topPanel.setBackground(Color.WHITE);
        topPanel.add(pageThreeLabel);

        centerPanel.add(valueLabel);

        bottomPanel.add(closeButton);

        add(topPanel, BorderLayout.NORTH);
        add(centerPanel, BorderLayout.CENTER);
        add(bottomPanel, BorderLayout.SOUTH);
    }
}

Model

PageOneModel.java

package Model;

public class PageOneModel {
    private String value = " ";

    public PageOneModel() {

    }

    public String getString() {
        return value;
    }

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

PageTwoModel.java

package Model;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class PageTwoModel {
    private BufferedImage pic = null;

    public PageTwoModel() {

    }

    public BufferedImage getImage() {
        try {
            pic = ImageIO.read(new File("email.png"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return pic;

    }   
}

Controller

package Controller;

import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

import Model.PageOneModel;
import View.PageOne;
import View.PageThree;
import View.PageTwo;

@SuppressWarnings("serial")
public class Controller extends JFrame {

    private CardLayout pages;
    private JPanel pagePanel;
    private PageOne pageOne;
    private PageTwo pageTwo;
    private PageThree pageThree;
    private PageOneModel pageOneModel;

    public Controller(PageOne pageOne, PageTwo pageTwo,PageThree pageThree,PageOneModel pageOneModel) {
        pages = new CardLayout();
        pagePanel= new JPanel();
        pagePanel.setLayout(pages);

        this.pageOne = pageOne;
        this.pageTwo = pageTwo;
        this.pageThree = pageThree;
        this.pageOneModel = pageOneModel;

        pagePanel.add(this.pageOne,"1");
        pagePanel.add(this.pageTwo,"2");
        pagePanel.add(this.pageThree,"3");
        pages.show(pagePanel,"1");

        this.pageOne.nextButtonListener(new GoToPageTwo());
        this.pageTwo.nextButtonListener(new GoToPageThree());

        add(pagePanel);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        pack();
        setSize(510,390);
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
    }

    class GoToPageTwo implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            pageOneModel.setString(pageOne.textFieldValue());
            pages.show(pagePanel,"2");
            pageTwo.setLabelValue(pageOneModel.getString());

        }
    }

    class GoToPageThree implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            pages.show(pagePanel,"3");          
        }
    }
}

Main

package Main;

import Controller.Controller;
import Model.PageOneModel;
import Model.PageTwoModel;
import View.PageOne;
import View.PageThree;
import View.PageTwo;

public class Main {

    private PageOneModel pageOneModel;
    private PageTwoModel pageTwoModel;
    private PageOne pageOne;
    private PageTwo pageTwo;
    private PageThree pageThree;

    public Main() {

        pageOneModel = new PageOneModel();
        pageTwoModel = new PageTwoModel();
        pageOne = new PageOne();
        pageTwo = new PageTwo(pageTwoModel);
        pageThree = new PageThree();
        new Controller(pageOne,pageTwo,pageThree,pageOneModel);
    }

    public static void main(String[] args) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                new Main();
            }
        });
    }
}
\$\endgroup\$
  • \$\begingroup\$ The desire to improve code is implied for all questions on this site. Question titles should reflect the purpose of the code, not how you wish to have it reworked. See How to Ask. \$\endgroup\$ – Jamal Jun 16 '15 at 4:45
  • \$\begingroup\$ ok then I will just ask is my MVC correct? \$\endgroup\$ – sam lee Jun 16 '15 at 4:48
  • 1
    \$\begingroup\$ That would still not be a sufficient title. \$\endgroup\$ – Jamal Jun 16 '15 at 4:49
  • \$\begingroup\$ I don't get it. isn't this site a code review site? \$\endgroup\$ – sam lee Jun 16 '15 at 4:50
  • \$\begingroup\$ Yes, but specific questions aren't needed in the title. They just belong in the post body. The title should just specify the code's purpose. \$\endgroup\$ – Jamal Jun 16 '15 at 4:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.