Avatar billede mosquito Nybegynder
08. juni 2003 - 17:35 Der er 7 kommentarer og
1 løsning

Model View Controller - hvordan styres en button i controlleren?

her er alle klasserne, som de ser ud nu, men jeg mangler at få Square knappen til at fungere, så det er den der laver udregningen og ikke ved enter i numberField. hvordan ændrer jeg det?

/******************************************************************
* View
******************************************************************/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class View extends JFrame
{
    private Model model;   
    private JTextField numberField, squareField;
    private JLabel numberLabel, squareLabel;
    private JButton button;

    public View(Model model)
    {
        this.model = model;
        Container contentPane = this.getContentPane();
        JPanel panel = new JPanel();
        numberLabel = new JLabel("Number:");
        numberField = new JTextField(5);
        squareLabel = new JLabel("m2:");
        squareField = new JTextField(5);
        squareField.setEditable(false);
        button = new JButton("Square");
        panel.add(numberLabel);
        panel.add(numberField);
        panel.add(squareLabel);
        panel.add(squareField);
        panel.add(button);
        contentPane.add(panel);
        numberField.addActionListener(new Controller(model, this));
        squareField.addActionListener(new Controller(model, this));
        button.addActionListener(new Controller(model, this));       
    }

    public int getNumber()
    {
        return Integer.parseInt(numberField.getText());
    }

    public void update()
    {
        numberField.setText("");
        squareField.setText(Integer.toString(model.getSquare()));
    }
}

/******************************************************************
* Model
******************************************************************/
public class Model
{
    private int number;

    int getNumber()
    {
        return number;
    }
   
    int getSquare()
    {
        return number * number;
    }
   
    void setNumber(int number)
    {
        this.number = number;
    }
}

/******************************************************************
* Controller
******************************************************************/
import java.awt.event.*;
import java.awt.event.*;

public class Controller implements ActionListener
{
    private Model model;
    private View view;

    public Controller(Model model, View view)
    {
        this.model = model;
        this.view = view;
    }
   
    public void actionPerformed(ActionEvent e)
    {
        model.setNumber(view.getNumber());
        view.update();
    }
}

/******************************************************************
* Test
******************************************************************/
import java.awt.event.*;

public class Test
{
    public static void main(String args[])
    {
        Model model = new Model();
        View view = new View(model);
        view.setTitle("Hello world");
        view.setSize(140, 150);
        view.setVisible(true);
        view.setResizable(false);
        view.addWindowListener(new WindowAdapter()
            {public void windowClosing(WindowEvent e) {System.exit(0);} });   
    }
Avatar billede arne_v Ekspert
08. juni 2003 - 17:42 #1
I din actionPerformed skal du teste på hvor event kommer fra.

Hvis det er square button skal den opdatere square i view.
Avatar billede mosquito Nybegynder
08. juni 2003 - 17:49 #2
arne_v > hvis jeg bruger if(e.getSource()==view.button) får jeg fejl, fordi knappen naturligvis er private... og det er her problemet er.. jeg har kigget i forskellige eksempler og kan stadig ikke se hvordan jeg får controlleren til at reagere på Square button. Samme er det med dit forslag. Jeg forstår ikke hvordan jeg får actionperformed til at reagere på en event uden at view også får en actionperformed og det var jo det jeg ville undgå ved dette mønster.
Avatar billede arne_v Ekspert
08. juni 2003 - 17:51 #3
Når knappen er private så kan du jo lave en public getButton metode.
Avatar billede mosquito Nybegynder
08. juni 2003 - 17:55 #4
arne_v > så vil event jo fanges i view, og det er controlleren der skal fange den.
Avatar billede arne_v Ekspert
08. juni 2003 - 17:57 #5
Nej.

Controlleren håndterer event. Den har bare brug for at vide lidt
om view for at processe event korrekt.
Avatar billede mosquito Nybegynder
08. juni 2003 - 18:04 #6
arne_v > det kan godt ske jeg er tung i toppen, men hvad laver actionperformed så i controlleren, hvis ikke det er den, der skal håndtere events fra view? måske du kan komme med et eksempel. jeg synes bare jeg bliver mere forvirret.
Avatar billede arne_v Ekspert
08. juni 2003 - 18:30 #7
Det er controlleren der håndterer event.

Den skal bare vide lidt.

Jeg prøver lige at brygge lidt kode sammen.
Avatar billede mosquito Nybegynder
08. juni 2003 - 18:32 #8
sådan.. takker for hjælpen.. selve eventen handles ikke af view, men controlleren. En reference til button som du foreslog gav dog løsningen alligevel. View fik endnu en metode:

public JButton getButton()
{
    return button;
}

som Controller dernæst har listener på:

public void actionPerformed(ActionEvent e)
{
    if (e.getSource()==view.getButton())
    {
    model.setNumber(view.getNumber());
    view.update();
    }
}

endnu engang tak for hjælpen :-) og god pinse
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB