1

あるクラスから別のクラスに整数を適切に渡すのに問題があります。

ユーザーが数値をテキスト フィールドに入力して、JPanel のグリッドのサイズを変更できる GUI を作成しています。

以下のように通常の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;
      }
}

0 より大きいという条件を満たしていないかのように、ユーザーが何を入力しても、グリッドは 10x10 のままです。グリッドは 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 が新しい寸法で再描画されます。

4

1 に答える 1

1

構文解析がいつ行われるかを尋ねたところ、次のように述べています。

これはreset()によって呼び出されます。アプレットが起動すると起動します。

次に、私が思ったとおりですgetText()。GUIが構築されているとき、およびユーザーがGUIを操作する時間がなくなる前に、JTextFieldを呼び出しています。現時点では、テキストフィールドに論理値が含まれないことは理にかなっています。

解決策は、上記のコメントで述べたように、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");
      }
   }

}
于 2013-02-17T04:34:28.313 に答える