一个JTextField存储和更新文本,另一个不存储

时间:2012-03-29 23:49:18

标签: text jtextfield

所以,我创建了一个接受数组并从中计算值的类。然后我决定(在不知不觉中)将其合并到GUI界面中。一切顺利,直到我注意到这个奇怪的错误;其中一个jtextfields(prarie)不存储文本而另一个(庭院)不存储文本。

我环顾四周,发现我的问题与我的问题类似; Updating text in a JTextField

但他有一个根本不起作用的地方,我有一个有效,有一个无效。

代码在这里(它有点长,但大多数是GUI),所以请屏住呼吸!:

import java.awt.GridLayout;
import javax.swing.Box;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Window {

/**
 * @param args
 */
private static int numb;
private static double micro, centi;
private static JTextField[] yard,prarie;
private static double[] charges,distances;

public static void main(String[] args) 
{
    //create a small dialog window to take in number of charged objects
    JPanel startup = new JPanel();
    JTextField many = new JTextField(5);
    startup.add(many);

    int result = JOptionPane.showConfirmDialog(null,startup , "Please Enter How Many Charged Objects are Being Evaluated", JOptionPane.OK_CANCEL_OPTION);
    many.requestFocusInWindow();

    //once ok is clicked, then the number input will be stored under 'numb' 
    //then proceed to inputFields
    if (result == JOptionPane.OK_OPTION) 
    {
        numb = Integer.parseInt(many.getText());
        inputFields();
    }
}

//this window opens the various JTextFields for input
public static void inputFields()
{


    //top JTextFields
    yard = new JTextField[numb];
    JPanel chargePanel = new JPanel();
    for(int x=0;x<numb;x++)
    {
        yard[x] =new JTextField(5);
        chargePanel.add(new JLabel("Charge "+ Integer.toString(x+1)+":"));
        chargePanel.add(yard[x]);
        chargePanel.add(Box.createVerticalStrut(15)); // a spacer
    }

    //bottom JTextFields
    prarie = new JTextField[numb-1];
    JPanel meterPanel = new JPanel(); 
    for(int x=0;x<numb-1;x++)
    {
        prarie[x]=new JTextField(5);
        meterPanel.add(new JLabel("Meters "+ Integer.toString(x+1)+":"));
        meterPanel.add(new JTextField(5));
        meterPanel.add(Box.createVerticalStrut(15)); // a spacer
    }

    //JCheckBoxes 
    JCheckBox isMicro = new JCheckBox("Charges are in terms of microCoulombs");
    JCheckBox isCm = new JCheckBox("Distances are in terms of centiMeters");

    JPanel chechBox = new JPanel();
    chechBox.add(isMicro);
    chechBox.add(Box.createVerticalStrut(20));
    chechBox.add(isCm);

    //Paste them all together into one window
    GridLayout gufi = new GridLayout(3,1);
    JPanel host = new JPanel(gufi);
    host.add(chargePanel);
    host.add(meterPanel);
    host.add(chechBox);
    int result1 = JOptionPane.showConfirmDialog(null, host, "Please Enter Charge and Distance Values", JOptionPane.OK_CANCEL_OPTION);

    //if ok is clicked, then go to 'printArr()' to print the JTextFields
    //then go to assign the values from the JTextFields to private double arrays 'yard' and 'prarie'
    if (result1 == JOptionPane.OK_OPTION) 
    {
        micro = (isMicro.isSelected())? Math.pow(10, -6): 1; 
        centi = (isCm.isSelected())? .01: 1;


        printArr();
        assign();
    }
}

//a makeshift method to print the value from the JTextFields 
//to fix the problem of why prarie wouldn't store numbers
public static void printArr()
{
    System.out.println("Charges are:");
    for(int x=0;x<numb;x++)
        System.out.print(yard[x].getText() + " ");
    System.out.println("Distances are:");
    for(int x=0;x<numb-1;x++)
        System.out.print(prarie[x].getText() + "  ");
}

//assigns values from JTextFields to the private double arrays 'yard' and 'prarie'
public static void assign()
{

    try {
        charges = new double[numb];
        for(int x=0;x<numb;x++)
            charges[x]=micro*Double.parseDouble(yard[x].getText().trim());

        distances = new double[numb-1];
        for(int x=0;x<numb-1;x++)
            distances[x]=centi*Double.parseDouble(prarie[x].getText().trim());

    } catch (NumberFormatException e) {
        e.printStackTrace();
        //inputFields();
    }
    calculate();
}
public static void calculate()
{


    JPanel sample = new JPanel();
    JTextField whichOne = new JTextField(5);
    sample.add(whichOne);

    int result = JOptionPane.showConfirmDialog(null,sample , "Please Enter Which Charged Object thy Wishs For", JOptionPane.OK_CANCEL_OPTION);
    whichOne.requestFocusInWindow();
    if (result == JOptionPane.OK_OPTION) 
    {
        int target = Integer.parseInt(whichOne.getText());



    }
}

}

任何运行代码并花时间输入虚拟值的人都会看到'yard'存储值,而'prarie'则不会。这是为什么?

*我很确定我会忽视(一如既往)。

1 个答案:

答案 0 :(得分:0)

变化:

meterPanel.add(new JTextField(5));

为:

meterPanel.add(prarie[x]);

在prarie textfields的for循环中