gpt4 book ai didi

java - mvc 和 GridBagLayout 中的 ActionPerformed 和 update(Model,Object)

转载 作者:行者123 更新时间:2023-12-01 18:13:15 25 4
gpt4 key购买 nike

我有几个问题,请原谅我的英语!问题:

  • 我的 Controller 中执行的操作没有反应
  • 而且我不知道如何在 View 中使用 update(model,object) 方法。
  • 下一个问题是我的 GridBag。尽管代码是面向oracle示例的,但看起来很困惑。
  • 没有最后一个。在 View 第 41 行中,由于模型中初始化的类,我得到了 NPE。不要没有为什么。我已经准备好测试该类是否已构造,是的,确实如此。

程序应该创建一个 JuliaSet。没有导入的类 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 的内容来注册 Controller

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

当模型的状态发生更改时,将代表您的模型调用 update 方法。您应该根据模型的新状态更新 View 。

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

但是,同样,它永远不会被调用,因为您永远不会向其中添加 Observer

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

是的,这就是适合您的 GridBagLayout

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 行?堆栈跟踪是什么样的?

一般建议

  • 在 Swing 中实现 MVC 并不是一件容易的事情,因为 Swing 使用它自己的 VC-M 形式,因此您最终需要加倍努力。不是做不到,而是你需要换位思考
  • 在某些形式的 MVC 中, Controller 了解模型和 View ,但模型和 View 彼此不了解,并且模型和 View 之间的所有通信都是通过 Controller 完成的。这是 Swing 实现的有点偏差的地方,但您应该意识到这是更常见的实现方式

首先定义 View 和 Controller 之间的契约。定义 Controller 可以在 View 上执行的操作以及 View 愿意接受的事件监听器。

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

例如,如果您有一个按钮,该按钮假定表示用户已读取以处理输入,那么您可以定义一个 View 支持的监听器之一中的 userAcceptedInput 事件。这样,另一个实现可以使用一些其他机制来触发事件,而 Controller 不关心。

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

关于java - mvc 和 GridBagLayout 中的 ActionPerformed 和 update(Model,Object),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31281196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com