Java 无法使用JTextField中的getText()

Java 无法使用JTextField中的getText(),java,swing,model-view-controller,jtextfield,Java,Swing,Model View Controller,Jtextfield,我一直在用Java完成我的学业,我正在用MVC设计模式构建一个TictaToe游戏。 我有三个类(模型、视图、控制器),我已经到了最终产品的最后一步。问题是: 我的JTextFields不会保留用户输入的值。我试图得到的是,用户选择的名称将被存储,并且能够通过控制器返回到模型。我尝试了不同的方法,向人们寻求帮助,搜索了几个论坛 我将Observable接口与这些类一起使用,并在控制器中使用ActionEvent 请看一看,让我知道你的想法 OBS!正如您将看到的,我已经尝试了几种不同的方法来解决

我一直在用Java完成我的学业,我正在用MVC设计模式构建一个TictaToe游戏。 我有三个类(模型、视图、控制器),我已经到了最终产品的最后一步。问题是:

我的JTextFields不会保留用户输入的值。我试图得到的是,用户选择的名称将被存储,并且能够通过控制器返回到模型。我尝试了不同的方法,向人们寻求帮助,搜索了几个论坛

我将Observable接口与这些类一起使用,并在控制器中使用ActionEvent

请看一看,让我知道你的想法

OBS!正如您将看到的,我已经尝试了几种不同的方法来解决这个问题,这就是为什么代码看起来像s*it

/*View Class */
import java.awt.*;

import java.awt.image.BufferedImage;
import java.io.*;
import java.text.ParseException;
import java.util.*;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.Border;


public class View extends JFrame implements Observer{

private JLabel _titleLabel, _westLabel, _eastLabel, _southLabel, _centerLabel;
private JPanel titlePanel, eastPanel, westPanel, southPanel, centerPanel, center2Panel, south2Panel;
private BufferedImage[] images;
private JButton _startButton;
private Model _model;
private Controller _controller;
public JTextField _player1, _player2;
private JButton[] button = new JButton[9];
private String path;
public String _player1Name, _player2Name;

// The title window (NORTH)




public View(Model aModel, Controller aController) {

    _model = aModel;
    _controller = aController;

    for (int i = 0 ; i<9; i++)
        button[i] = new JButton();


    // pre for path: Requires that pictures are in the same map as the core folder.

    path = "./";

    // Creating the main background for the game.

    this.setContentPane(new JLabel (new ImageIcon(path + "GameFrame.png")));
    this.setLayout(new BorderLayout());

    // Adding all the initiated panels for the main BorderLayout.       

    this.add(titlePanel, BorderLayout.NORTH);
    this.add(westPanel, BorderLayout.WEST);
    this.add(eastPanel, BorderLayout.EAST);
    this.add(southPanel, BorderLayout.SOUTH);
    this.add(centerPanel, BorderLayout.CENTER);

    // Setup for the main frame/game.           

    this.setTitle("Tic Tac Toe Game");
    this.setSize(600,600);
    this.setVisible(true);
    this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    this.setResizable(false);

}


public void update(Observable aModel, Object arg) {


    if (_model.getStart()) {

        enterName();


    if (_model.getGameStart()) {
        System.out.println("Booting up");


        System.out.println(getField1() + getField2());

        _controller.setNames(getField1(), getField2());



    }


    }

}



public void enterName(){

    //A form to enter the names of the players

    centerPanel.remove(center2Panel);
    validate();
    center2Panel = new JPanel ();
    centerPanel.add(center2Panel);
    center2Panel.setOpaque(false);

    // Copied code, works the same way and keeps the same pattern.

    center2Panel.setLayout(new GridBagLayout ());
    GridBagConstraints c = new GridBagConstraints();

    c.fill = GridBagConstraints.HORIZONTAL;
    c.insets = new Insets(1, 1, 1, 1);
    c.gridwidth = GridBagConstraints.REMAINDER;

    center2Panel.add(new JLabel("First enter your names: "), c);

     _player1 = new JTextField("Skriv namn");
    _player1.setColumns(20);




    _player2 = new JTextField(_model.getPlayerName(2));
    _player2.setColumns(20);

    //_player2.setText(getField1());


    center2Panel.add(_player1, c);
    center2Panel.add(_player2, c);

    _startButton = new JButton ("Start Game");
    center2Panel.add(_startButton, c);
    _startButton.addActionListener(_controller);
    _startButton.setActionCommand("start_button");



    validate(); 

    _player1Name = _player1.getText();
}

public String getField1(){


    System.out.println(_player1Name);
    return _player1.getText();
}
public String getField2(){
    return _player2.getText();
}

}

您的代码非常长,很难对其进行分析

但我想我可以给你一些概念上的建议

您可以将其架构更改为类似这样的架构

未测试

class View extends ... implements ...
{
  private Controller controller =new Controller(this);

  View(){...}

  protected JTextField getTextField0(){return this.jTextField0;}
  protected JTextField getTextField1(){return this.jTextField1;}
}

class Controller implements ... 
{

  private Model model=new Model();

  private View view;
  protected Controller(View view){this.view=view;}

  protected void setNames()
  {
    this.getModel().setNames(this.getView().getTextField0().getText(),this.getView().getTextField1().getText())
  }


  private Model getModel(){return this.model;}
  private View getView(){return this.view;}
}

class Model implements ...
{
  ...

  protected void setNames(String one,String two){...}
}
另外,我将代码作为一个基本概念来编写,因此您必须根据您的情况对其进行调整


我希望它能帮助您找到这个问题。这是我这边的一次重大失败

  • 当一个新的观点被提出时,旧的观点被扔掉了,thich也扔掉了我试图达到的“文本”

在扔掉视图之前制作getText时解决了这个问题

1)为了更快地获得更好的帮助,请发布一个。2) 你的问题是什么?查看类(相关方法)如何知道其余的不相关?无论如何,如果没有一个完整的代码,很难判断问题出在哪里。我们不知道剩下的代码是什么。我能告诉你的是
\u player1.setText(\u player1.getText())是无用的<代码>画板();paintScore()
看起来非常可疑(通常,您所做的只是调用
repaint()
。您应该使用
revalidate()
覆盖
validate()
centerPanel.remove(center2Panel);validate();center2Panel=new JPanel();
看起来也很可疑。1:那么,有没有简单的方法在这里发布完整的代码?创建SSCCE感觉很困难,大部分代码都是需要的(我是新手)。我的问题是:如果我调用getField()的话,TextFields文本不应该存储并返回吗方法?@Jack创建一个并没有那么难,我想说的是,有一半的时间,尝试创建一个的简单过程会让你找到问题。现在我在你的代码中看到一个巨大的问题:在方法
enterName()中
,您声明了两个局部变量
JTextField\u player1
JTextField\u player2
,它们隐藏了具有相同名称的类成员。我很确定您只需编写
\u player1=new JTextField…
\u player2=new JTextField…
。这可能是您问题的根源。@GuillaumePolet我做了一些SSCE,只是为了让代码可见。编译和运行它是不起作用的,但问题不是运行,而是从用户输入的JTextField中检索值。它需要通过控制器->模型,然后更改视图(MVC)
class View extends ... implements ...
{
  private Controller controller =new Controller(this);

  View(){...}

  protected JTextField getTextField0(){return this.jTextField0;}
  protected JTextField getTextField1(){return this.jTextField1;}
}

class Controller implements ... 
{

  private Model model=new Model();

  private View view;
  protected Controller(View view){this.view=view;}

  protected void setNames()
  {
    this.getModel().setNames(this.getView().getTextField0().getText(),this.getView().getTextField1().getText())
  }


  private Model getModel(){return this.model;}
  private View getView(){return this.view;}
}

class Model implements ...
{
  ...

  protected void setNames(String one,String two){...}
}