Один JTextField хранит и обновляет текст, другой нет - PullRequest
0 голосов
/ 30 марта 2012

Итак, я создал класс, который принимает массивы и вычисляет из них значение.Затем я решил (неосознанно) включить его в интерфейс GUI.Все прошло хорошо, пока я не заметил эту странную ошибку;одно из jtextfields (prarie) не будет хранить текст, в то время как другое (yard) хранит.

Я оглянулся и обнаружил, что моя проблема похожа на мою на этом сайте; Обновление текста в 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());



    }
}

}

Любой, кто управляеткод и займет время, чтобы ввести фиктивные значения, увидит, что «ярд» хранит значения, а «прери» нет.Почему это так?

* Я почти уверен, что упускаю из виду очевидное (как всегда).

1 Ответ

0 голосов
/ 30 марта 2012

Измените:

meterPanel.add(new JTextField(5));

на:

meterPanel.add(prarie[x]);

в цикле for для текстовых полей прерии

...