【问题标题】:Passing an integer from user input to another class将整数从用户输入传递到另一个类
【发布时间】:2013-02-17 03:52:25
【问题描述】:

我在将整数从一个类正确传递到另一个类时遇到问题。

我正在创建一个 GUI,用户可以在文本字段中输入一个数字来调整 JPanel 中网格的大小。

如果我像下面这样用普通的 int 编写它,它就可以正常工作,

public int getGridSize() {
    return 6;
}

但是当我尝试更改代码时,它从文本字段中获取字符串(字段中的默认文本是数字“12”),如下所示。

private void initComponents() {

        gridPanel1 = new lizasummerschol.GridPanel();
        gridSize = new javax.swing.JTextField();

    gridSize.setText("12");
        gridSize.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gridSizeActionPerformed(evt);
            }
        });

 private void goBActionPerformed(java.awt.event.ActionEvent evt) {                                    
     size = Integer.parseInt(gridSize.getText());
     gridPanel1.executeUserCommands("reset"); 
     goB.setText("s "+size);
 }                                   


public void setGridSize() {
   this.size = size;
}

public int getGridSize() {
  if (this.size > 0) {
    return this.size;
  }
    else {
       return 10;
      }
}

无论用户输入什么,网格都保持 10x10,就好像它不满足大于 0 的条件一样。 网格在名为 GridPanel 的 JPanel 中生成。这是我认为相关的代码。

package lizasummerschol;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;

public class GridPanel extends JPanel implements MouseListener, ActionListener {
    GridJApplet myGridJApplet = new GridJApplet();    
    public int NUMBER_ROWS;
    public int NUMBER_COLS; 
public static int LEFT = 15;
public static int DOWN = 15;
public static int SIZE = 15;

    private int particleColour;
    private int fixedness;
    private int iteration;

    private Graphics bufferGraphics;

    private Image offScreenImage;
    private Image offScreenImageDrawed;
    private Graphics offScreenGraphics;
    private Graphics offScreenGraphicsDrawed;

private int [][] particle;
    private int [][] fixed;

    public GridPanel() {      
            addMouseListener( this );
    reset();
    }
    //Initialise particle with random colours

    private void initialiseRandomly() {
        NUMBER_ROWS = NUMBER_COLS = myGridJApplet.getGridSize();    
        particle = new int[NUMBER_ROWS][NUMBER_COLS];
        fixed = new int[NUMBER_ROWS][NUMBER_COLS];

      for ( int i=0; i < NUMBER_ROWS; i++ ) {
    for ( int j=0; j < NUMBER_COLS; j++ ) {
        if( Math.random()*3 < 1 ) {
            particle[i][j] = 0 ;
                            } else if ( Math.random()*3 < 2) {
            particle [i][j] = 1 ;
                           } else {
                               particle[i][j] = 2 ;
            }
                    fixed[i][j] = 0;
        }
       }  
    iteration = 1;
}

解析为整数的字符串是否与整数不同?我的想法是,当小程序初始化时,它应该从 gridSize 中获取“12”,然后当 gridSize 中的文本发生更改(并按下“Go”按钮)时,它将使用新尺寸重绘 GridPanel。

【问题讨论】:

  • 这可能不是正确的表达方式,但我的意思是,如果我有一个字符串 myString = 6,然后转到 Integer.parseInt(myString),是否与整数完全相同6,还是有一些细微的差异导致了我的问题。
  • 如果你的 String myString = "6",然后你解析它,那么它将是 int 6,只有 int 6,不多也不少。恐怕您的代码和您上面的帖子没有给我们足够的信息来让我们猜测您的问题可能是什么。我怀疑在用户有机会与您的 GUI 交互之前,您可能不是在解析事件侦听器(例如 ActionListener),而是在类的构造函数中解析,但这只是基于不完整信息的愚蠢的 @ssed 猜测。请提供更多信息,以便我们祈祷回答这个问题。
  • 类定义会起作用。特别是您定义了gridSize
  • @HovercraftFullOfEels 我在原始问题中添加了更多代码。谢谢你看。现在更有意义了吗?阿什温,我不确定你的意思。
  • 还没有。 initialiseRandomly() 在哪里被调用?

标签: java string parsing user-interface integer


【解决方案1】:

当我问到你的解析何时发生时,你说:

由reset()调用,小程序启动时启动。

然后,正如我所怀疑的那样:您正在 JTextField 上调用 getText(),此时 GUI 正在构建中,并且在用户有任何时间与 GUI 交互之前。此时文本字段将不包含任何逻辑值是有道理的。

解决方案就像我在上面的评论中所说的那样,在事件侦听器(例如 ActionListener)中进行解析。这意味着解析将在用户触发事件时进行,例​​如按下触发 ActionListener 的 JButton 或单击 JLabel 并触发 MouseListener 时。这样您就可以在用户表示已完成输入并且需要进行计算时从用户那里获取信息。

例如:

import java.awt.event.*;
import java.lang.reflect.InvocationTargetException;
import javax.swing.*;

public class ParseTextFieldEg extends JApplet {

   @Override
   public void init() {
      try {
         SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
               createGui();
            }
         });
      } catch (InvocationTargetException e) {
         e.printStackTrace();
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
   }

   private void createGui() {
      ParseTextFieldPanel panel = new ParseTextFieldPanel();
      panel.reset();  // *** calling reset at the wrong time!

      getContentPane().add(panel);
   }

}

class ParseTextFieldPanel extends JPanel {
   private JTextField textField = new JTextField(10);
   private JButton button = new JButton("Push Me");

   public ParseTextFieldPanel() {
      add(textField);
      add(button);

      button.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            reset();  // *** calling reset at the *right* time!
         }
      });
   }

   public void reset() {
      int myInt;
      try {
         myInt = Integer.parseInt(textField.getText());
         JOptionPane.showMessageDialog(this, "myInt is " + myInt);
      } catch (NumberFormatException e) {
         JOptionPane.showMessageDialog(this, "myInt is not yet available or is a non-number");
      }
   }

}

【讨论】:

  • 这更有意义,谢谢!我将如何在 ActionListener 中解析它?
  • @user2077261: 你会像现在解析它一样在 ActionListener 中解析它,除了代码由 ActionListener 的 actionPerformed(...) 方法调用,并且 ActionListener 被添加到JButton 或 JTextField 或其他可以接受它并可以触发操作的组件。这其中的哪一部分特别让您感到困惑?如果您尝试过此操作并遇到错误,请编辑您的问题,在底部显示您的新代码和错误,然后让我们尝试解决它。​​
  • 我可以这样做吗?只有这样,它才会每次都将其设置为 10,即使它已经启动。我只希望它在启动时设置为 10。 size = Integer.parseInt(gridSize.getText()); 在 JButton 的操作事件中。然后是 setter 和 getter? public void setGridSize() { this.size = size; } public int getGridSize() { if (size &gt; 0) { return size; } else { return 10; } }
  • @user2077261:请将此代码和问题显示为对原始问题末尾的编辑。代码在 cmets 中显示不佳。另外,请让我们知道当您尝试执行您的建议时会发生什么。通常,解决这些问题的最佳方法是将您的 Java 编译器用作实验室,您可以在其中试验不同的程序,直到正确为止。
  • 感谢您发布示例代码 =D 我认为可能有一些简单的东西,就像我在编辑中展示的那样,但我对 Java 非常非常陌生,所以大多数时候,大错特错。 =P 感谢您的帮助
猜你喜欢
  • 2021-03-21
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多