执行的动作在mvc和GridBagLayout中更新(Model,Object) [英] ActionPerformed & update(Model,Object) in mvc and GridBagLayout

查看:77
本文介绍了执行的动作在mvc和GridBagLayout中更新(Model,Object)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个问题,请问我的中文! 问题:

I have severall question and excuse my denglish! Problems:

  • 我在控制器中执行的操作没有反应
  • 而且我不知道如何在视图中使用update(model,object)方法.
  • 下一个问题是我的GridBag.尽管代码是针对oracle示例的,但看起来还是很混乱.
  • 没有最后一个.在视图线41中,由于模型中初始化的类,我得到了NPE.不,为什么.我已经准备好测试一下是否构造了类,是的.

该程序应具有JuliaSet. 没有Theire导入的类 控制器:

The Programm should greate a JuliaSet. Classes without theire imports Controller:

public class JuliaController extends WindowAdapter implements ActionListener {

private JuliaView view;
private JuliaModel model;
private String linkBuffer;

public JuliaController(){
    model = new JuliaModel();

    System.out.println("true!");
    view = new JuliaView("JuliaMenge");
    view.makeView();
}
@Override
public void actionPerformed(ActionEvent arg0) {
    String action = arg0.getActionCommand();
    if(action.equals(view.ACTION_CLEAR))
    {
        //Clear Graphics
        view.setBtClear();
    }
    if(action.equals(view.ACTION_COMPLEX))
    {
        String input = view.getComplex();
        view.setTfComplex();            //Zurücksetzen des Felds!

        model.juliaBerechnung(input);
        view.getBtPaint();      //Setzt den Button auf anklickbar
        //Paint Button anklickbar machen
    }
    if(action.equals(view.ACTION_ENDE))
    {
        view.release();
        System.exit(0);
    }
    if(action.equals(view.ACTION_LINK))
    {

        String inLink = view.getTfLink();
        view.setTfLink();
        try {
            model.juliaBerechnung(dataInList(inLink));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        view.getBtPaint();

    }
    if(action.equals(view.ACTION_PAINT))
    {
        //Erzeuge Graphics!

        view.getBtPaint();      //Button nicht mehr anklickbarkeit

    }

}
public String dataInList(String link)throws IOException
{
    String temp="";
    BufferedReader inBuffer = null;
    try {
        inBuffer = new BufferedReader(new FileReader(new File(link)));
        while((temp=inBuffer.readLine())!=null)
        {
            //System.out.println("Buffer : "+temp);
            linkBuffer += temp;
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    int dateiLength = linkBuffer.length();
    inBuffer.close();

    char c;
    int index=0;
    for(int i = index;index<dateiLength;index++){
        c = linkBuffer.charAt(index);
        if((c=='+')||(c=='-'))break;
    }
    temp = "";
    for(int i=index;i<index+8;i++)
    {
        temp+=linkBuffer.charAt(i); 
    }
    return temp;        //Keine Anhang in der Datei
}

public void release() {
    // TODO Auto-generated method stub
    model = null;
    view = null;

}
public void windowClosing( WindowEvent we)
{
    view.release();
}

}

查看:

public class JuliaView extends JFrame implements Observer{

//:::: ACTIONS
public final String ACTION_ENDE = "Ende";
public final String ACTION_PAINT = "Paint";
public final String ACTION_COMPLEX = "+a.x+b.x";
public final String ACTION_LINK = "Link";
public final String ACTION_CLEAR = "Clear";
//:::: Components
private JButton btEnde;
private JButton btPaint;
private JButton btClear;
public JuliaPanel drawArea;     //Bereich für Paint
//private JButton btAutoPaint;
private JTextField tfComplex;
private JTextField tfLink;
//:::: Observer
private JuliaModel model;
private JuliaController controller;
private JuliaBild map;



public JuliaView(String titel){
    super(titel);
    this.model = model;
    //this.map = model.getMap();            //??????//Iterationsarray einbinden
    //this.model.addObserver(this);
    //controller = makeController();
    initForm();
    //makeView();
}
void makeView() {

    resetView();

    // Fenster
    addWindowListener( controller);
    pack();
    setVisible( true);

}
/*private JuliaController makeController() {                ?????????????????
    return new JuliaController();
}*/

/**
 * Anordnen der Komponenten im GridBag
 */
private void initForm(){
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLayout(new GridBagLayout());
    this.setBounds(200, 200, 800, 600);
    GridBagConstraints c = new GridBagConstraints();
    c.insets = new Insets(15,15,15,15);
    //this.add(btAutoPaint,c);


    // TextField für Kompleze Zahl
    tfComplex = new JTextField(ACTION_COMPLEX,8);
    tfComplex.addActionListener(controller);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 2;
    this.getContentPane().add(tfComplex,c);

    // Link
    tfLink = new JTextField(ACTION_LINK);
    tfLink.addActionListener(controller);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.gridy = 1;
    c.gridwidth = 2;
    this.getContentPane().add(tfLink,c);
    // Paint Button
    btPaint = new JButton(ACTION_PAINT);
    btPaint.setEnabled(false);
    btPaint.addActionListener(controller);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.gridy = 2;
    c.gridwidth = 2;
    c.ipady = 40;
    this.getContentPane().add(btPaint,c);
    //CLS Button
    btClear = new JButton(ACTION_CLEAR);
    btClear.addActionListener(controller);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.gridy = 4;
    c.gridwidth = 2;
    this.getContentPane().add(btClear,c);
    //Exit Button
    btEnde = new JButton(ACTION_ENDE);
    btEnde.addActionListener(controller);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 1;
    c.gridy = 5;
    c.gridwidth = 1;
    this.getContentPane().add(btEnde,c);
    //draw area
    drawArea = new JuliaPanel(); //Place for the JuliaSet
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.gridx = 2;
    c.gridy = 0;
    c.gridwidth = 6;
    this.getContentPane().add(drawArea,c);
    setVisible( true);
    pack();
}
public void resetView(){
    this.tfComplex.setText("+a.x+b.x");
    this.tfLink.setText("c:/...");
    //drawArea.paint(g);
}
@Override
public void update(Observable m, Object o) {
    // TODO Auto-generated method stub
    if(model == m) setBtPaint();    //???

}
public void setBtPaint()
{
    btPaint.setText(ACTION_PAINT);
    btPaint.requestFocus();
    btPaint.setEnabled(true);
    drawArea.setKoordinaten(map);
    //Zeichnen
    //drawArea.repaint();
    drawArea.print(getGraphics());
    //drawArea.paint(getGraphics());
}
public void getBtPaint()
{
    btPaint.setText(ACTION_PAINT);
    drawArea.createImage();
    btPaint.requestFocus();
    btPaint.setEnabled(false);          //anklickbarkeit
}
public void setBtClear()
{
    btClear.setText(ACTION_CLEAR);
    resetView();
    drawArea.clearImage();
    btClear.requestFocus();
}
public void setTfComplex()
{
    tfComplex.setText(ACTION_COMPLEX);
    tfComplex.setCaretPosition(tfComplex.getText().length());
    tfComplex.requestFocus();
}
public void setTfLink()
{
    tfLink.setText(ACTION_LINK);
    tfLink.setCaretPosition(tfLink.getText().length());
    tfLink.requestFocus();
}
public void getBtEnde()
{
    btEnde.setText(ACTION_ENDE);
    btEnde.requestFocus();
}

public String getComplex()
{
    String temp = "";
    temp = tfComplex.getText();
    return temp;
}
public String getTfLink()
{
    String temp = tfLink.getText();
    return temp;
}

public void release(){

    dispose();

    // Controller
    controller.release();
    controller = null;

    // Model
    model.deleteObserver( this);
    model = null;
}

} 型号:

public class JuliaModel extends Observable{
//private Complex startWert;
private Complex konst;
private String pfad;
private JuliaBild map;

public JuliaModel()
{
    //startWert = new Complex(re, im);
    konst = new Complex(1.0,1.0);
    pfad = "";
    makeBild();
}
private void makeBild()
{
    map = new JuliaBild(600,600);
    System.out.println("bild true");
}
public JuliaModel(double reK, double imK)
{
    map = new JuliaBild(600,600);
    //startWert = new Complex(re, im);
    konst = new Complex(reK,imK);
    pfad = "";
}

private int grundAlgoIt(double x,double y)
{
    Complex temp = new Complex(x,y);
    double xTemp=0;
    for(int n=0;n<256;n++)
    {
        if(temp.abs()<4){return n;}
        xTemp = Math.pow(temp.getRe(), 2)-Math.pow(temp.getIm(), 2) + konst.getRe();
        temp.setIm((2*temp.getIm()*temp.getRe())+konst.getIm());//y=
        temp.setRe(xTemp);
    }
    return 0;
}
void juliaBerechnung(String input)
{
    double xmin = -2.0;//fx
    double ymin = -2.0;//fy
    double width  =  4.0;//fw       //Weg im Koordinatensystem
    double height =  4.0;//fh
    double schrittWeite = 4.0/600;
    stringToKonst(input);
    //Complex temp = new Complex(xmin-schrittWeite,1);
    double xTemp,yTemp;
    xTemp = xmin-schrittWeite;
    //durch die Pixel gehen
    for(int j=0;j<600;j++)
    {
        xTemp = xTemp+schrittWeite;
        yTemp = ymin;
        for(int i=0;i<600;i++)
        {
            yTemp = yTemp + schrittWeite;
            map.setBild(j,i,grundAlgoIt(xTemp,yTemp));
        }
    }
}

private void stringToKonst(String in)
{
    char cBuffer;
    String sBuffer="";
    double im = 0;
    double re = 0;
    for(int a=0;a<=4;a+=4)
        for(int i=0;i<4;i++)
        {
            cBuffer = in.charAt(i+a);
            sBuffer+=cBuffer;
            if(a==0&&i==4)
            {
                re = Double.parseDouble(sBuffer);
            }
            if(a==4&&i==4)
            {
                im = Double.parseDouble(sBuffer);
            }
        }
    konst.setNumber(re, im);
}
public JuliaBild getMap()
{
    return map;
}}

感谢您的帮助!

推荐答案

我在控制器中执行的操作没有反应

My actionPerformed in my controller dont react

这是因为您从未向控制器注册任何能够产生ActionEvent

This is because you never register you controller with anything that is capable of producing a ActionEvent

我不知道如何在视图中使用update(model,object)方法.

and I dont know how to use the update(model,object) method in the View.

update方法在状态更改时代表您的模型被调用.您应该根据模型的新状态来更新视图.

The update method is called on behalf of your model when it's state is changed. You should update the view based on the new state of the model.

如果模型支持多个属性,则PropertyChangeListener可能更适合.如果模型具有不同的状态,则最好定义自己的侦听器,以定义模型可能触发的状态.

If your model supports multiple properties, a PropertyChangeListener might be better suited. If the model has different states, you might be better defining your own listener, which defines the states that the model might trigger.

但是,再也不会调用它,因为您永远不会在其中添加Observer

But, again, it will never be called, as you never add an Observer to it

下一个问题是我的GridBag.尽管代码是针对oracle示例的,但看起来还是很混乱.

The next problem is my GridBag. It looks chaotic although the code is orientated on the oracle example.

是的,这就是您的GridBagLayout

没有最后一个.在视图线41中,由于模型中初始化的类,我得到了NPE.不,为什么.我已经准备好测试一下是否构建了类,是的

No the Last one. in the view line 41 i get a NPE as a result of a class initialised in the Model. dont no why. I allready testes if the Class is constructed and yes it is

哪个行41?堆栈跟踪是什么样的?

Which one's line 41? What's the stack trace look like?

  • 在Swing中实现MVC并不是一件容易的事,因为Swing使用自己的VC-M形式,因此最终会使工作量加倍.不是说它不能完成,而是您需要以不同的方式思考
  • 在某些形式的MVC中,控制器了解模型和视图,但是模型和视图彼此不了解,并且模型和视图之间的所有通信都是通过控制器完成的.这是Swing实施方式偏离的地方,但是您应该意识到,这是更常见的实施方式

首先定义视图和控制器之间的协定.定义控制器可以对视图执行的操作以及视图愿意接受的事件侦听器.

Start by defining the contract between the view and the controller. Define the actions that the controller can perform on the view as well as the event listeners the view is willing to accept.

通常,我避免直接​​从控制器将侦听器附加到视图控件,而是定义视图可以生成的事件,这样,您可以将两者之间的契约解耦,并允许视图和控制器的不同实现一起工作

Generally, I avoid attaching listeners directly to view controls from the controller and instead define events that the view can generate, in this way, you decouple the contract between the two and allow for different implementations of the view and controller to work together.

例如,如果您有一个按钮,该按钮表示已读取用户以处理输入,而不是允许控制器直接向该按钮添加ActionListener,则可以在其中定义一个userAcceptedInput事件视图支持的侦听器之一.这样,另一种实现可以使用其他机制来触发事件,而无需控制器.

For example, if you have a button which is suppose to signify the user is read to process the input, instead of allowing the controller to directly add a ActionListener to the button, you would define a userAcceptedInput event in one of the listeners that the view supports. This way, another implementation could use some other mechanism to trigger the event, by the controller doesn't care.

有关该主题的更多讨论,请查看:

For more discussions on the subject have a look at:

  • Java and GUI - Where do ActionListeners belong according to MVC pattern?
  • Dealing with MVC model, jbuttons and ActionListener's getSource() method
  • What is the correct way of Message Passing between Classes in MVC?

这篇关于执行的动作在mvc和GridBagLayout中更新(Model,Object)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆