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