Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. I have a Jframe that includes a Jspinner. When the JSpinner is increased a new JTextField is created in my panel headerPanel. The script creates the textboxes with an integer attached to their variable name (tFrame0, tFrame1, and so on).
  2.  
  3.         spinner = new JSpinner();
  4.         spinner.addContainerListener(new ContainerAdapter() {
  5.             @Override
  6.             public void componentAdded(ContainerEvent arg0) {
  7.                 boxesChanged();
  8.             }
  9.         });
  10.         spinner.addChangeListener(new ChangeListener() {
  11.             public void stateChanged(ChangeEvent arg0) {
  12.                 int spinnerValue = (Integer) spinner.getValue();
  13.                 if (spinnerValue == headerPanel.getComponentCount()) {
  14.                     System.out.println("Error, spinner shouldn't change to same value");
  15.                 }
  16.  
  17.                 if (spinnerValue < headerPanel.getComponentCount()) {
  18.                     headerPanel.removeAll();
  19.                 }
  20.  
  21.                 while (spinnerValue > headerPanel.getComponentCount()) {
  22.                     boxesChanged();
  23.  
  24.                     // frame.getContentPane().add(tField);
  25.                     frame.revalidate(); // For JDK 1.7 or above.
  26.                     // frame.getContentPane().revalidate(); // For JDK 1.6 or below.
  27.                     frame.repaint();
  28.                 }
  29.             }
  30.         });
  31.  
  32. Now I'm trying to loop through my code based on the number of components in my headerPanel but I don't know how to append my for loop int i to a variable name.
  33.  
  34. Variables
  35.  
  36.     Public JTextField() tField;
  37.     Public String nameTField = "tFrame";
  38.     Public Object[] inputData;
  39.    
  40.  
  41. Creating the text boxes
  42.  
  43.     public void boxesChanged() {
  44.         tField = new JTextField();
  45.         tField.setName(nameTField + (headerPanel.getComponentCount()));
  46.         headerPanel.add(tField);
  47.     }
  48.  
  49. Loop attempt (Located in a separate class with access to the GUI)
  50.  
  51.     int hp = headerPanel.getComponentCount();
  52.     inputData = new Object[hp];
  53.     for (int i = 0; i < hp; i++) {
  54.         tField = new JTextField();
  55.         tField.setName(nameTField + i);
  56.         inputData[i] = tField.getText();
  57.     }
  58.  
  59. EDIT
  60.  
  61. I was able to make some headway with this https://stackoverflow.com/questions/24642059/for-loop-output-in-jframe?fbclid=IwAR1piMmk8EjygobXdxkyxfM9idA5pCh4WJrpBx9QINbsMcmc5MvaUZ3gb0I. When creating the textboxes, I can assign a Document Listener to them and then they are able to pass me information. I'm still having some issues with how I can assign each input from these to my for loop however.
  62.  
  63.     public void boxesChanged() {
  64.     tField = new JTextField();
  65.     tField.setName(nameTField + (headerPanel.getComponentCount()));
  66.     tField.getDocument().addDocumentListener(new DocumentListener(){
  67.           public void changedUpdate(DocumentEvent e) {
  68.             warn();
  69.           }
  70.           public void removeUpdate(DocumentEvent e) {
  71.             warn();
  72.           }
  73.           public void insertUpdate(DocumentEvent e) {
  74.             warn();
  75.           }
  76.  
  77.           public void warn() {
  78.              if(tField.getText()!=null) {
  79.                  System.out.println(tField.getText());
  80.              }
  81.           }
  82.     });
  83.  
  84.     headerPanel.add(tField);
  85.  
  86.     }
  87.  
  88. EDIT 2
  89.  
  90. I've managed to make a change that adds each textfields information to my inputData Object[], but only if I add data sequentially (tField0 must be filled out, then tField1, etc).
  91.  
  92. For some reason each time I add a new JTextField it changes the document listener to that field only, even though I create the document listener in each new JTextField.
  93.  
  94.        public void boxesChanged() {
  95.        int hp = headerPanel.getComponentCount();
  96.  
  97.        tField = new JTextField();
  98.        textFieldList.add(tField);
  99.        tField.setName(nameTField + hp);
  100.  
  101.        tField.getDocument().addDocumentListener(new DocumentListener() {
  102.  
  103.            public void changedUpdate(DocumentEvent e) {
  104.                warn();
  105.            }
  106.  
  107.            public void removeUpdate(DocumentEvent e) {
  108.                warn();
  109.            }
  110.  
  111.            public void insertUpdate(DocumentEvent e) {
  112.                warn();
  113.            }
  114.  
  115.            public void warn() {
  116.                int digits = 1;
  117.  
  118.                if (hp > 9) {
  119.                    digits = 2;
  120.                }
  121.  
  122.                String getFieldString;
  123.                int getFieldNum;
  124.  
  125.                getFieldString = tField.getName().substring(tField.getName().length() - digits);
  126.  
  127.                getFieldNum = Integer.parseInt(getFieldString);
  128.  
  129.                if (tField.getText() != null) {
  130.                    Object[] currentData = new Object[getFieldNum + 1];
  131.                    currentData[getFieldNum] = tField.getText();
  132.  
  133.                    inputData[getFieldNum] = tField.getText();
  134.  
  135.                    for (int i = 0; i < inputData.length; i++) {
  136.                        if (inputData[i] != null) {
  137.                            System.out.println("for i = " + i + ": " + inputData[i]);
  138.                        }
  139.  
  140.                    }
  141.                }
  142.            }
  143.        });
  144.  
  145.  
  146. With this setup if I set the default JTextField to "Box 1" my console output will look like this.
  147.  
  148.    for i = 0: B
  149.    for i = 0: Bo
  150.    for i = 0: Box
  151.    for i = 0: Box
  152.    for i = 0: Box 1
  153.  
  154. If I create the second JTextField and then type in "Box 2" in that field it will output like this
  155.  
  156.    //Same as above
  157.    for i = 0: Box 1
  158.    for i = 1: B
  159.    for i = 0: Box 1
  160.    for i = 1: Bo
  161.    for i = 0: Box 1
  162.    for i = 1: Box
  163.    for i = 0: Box 1
  164.    for i = 1: Box
  165.    for i = 0: Box 1
  166.    for i = 1: Box 2
  167.  
  168. However say I decide to change the boxes to "Box 0" and "Box 1" my console after making both of these changes will output this.
  169.  
  170.    //Same as above
  171.    for i = 0: Box 1 //Deleted "1" from box 1
  172.    for i = 1: Box 2 //Deleted "1" from box 1
  173.    for i = 0: Box 1 //Added "0" to former box 1
  174.    for i = 1: Box 2 //Added "0" to former box 1
  175.    for i = 0: Box 1 //Deleted 2 from box 2
  176.    for i = 1: Box //Deleted 2 from box 2
  177.    for i = 0: Box 1 //Added 1 to former box 2
  178.    for i = 1: Box 1 //Added 1 to former box 2
  179.  
  180. If I were to keep going and add a 3rd JTextField etc. only the last created JTextField will show a change in output on the console.
  181.  
  182. EDIT 3
  183.  
  184. I have managed to pass the code along a little further now. Now I can store all of my data properly within an ArrayList that will hold my data, but only if I enter my data sequentially.
  185.  
  186. Variables
  187.  
  188.    Public JTextField() tField; //textField element is public and created in boxesChanged()
  189.    Public String nameTField = "tFrame"; //Name of TextField before appending variable in spinner
  190.    Public Object[] headerData; //inputData changed to headerData in Edit 3.
  191.    private ArrayList<JTextField> textFieldList = new ArrayList<JTextField>(); //ArrayList that holds JTextFields
  192.    private JPanel headerPanel; //Panel that holds JTextFields
  193.  
  194.  
  195. My Spinner
  196.  
  197.    spinner = new JSpinner(); //New spinner
  198.         spinner.addContainerListener(new ContainerAdapter() {
  199.             @Override
  200.             public void componentAdded(ContainerEvent arg0) { //On creation Spinner value is 1, so runs boxesChanged() to set the first JTextFrame
  201.                 boxesChanged();
  202.             }
  203.         });
  204.         spinner.addChangeListener(new ChangeListener() {
  205.             public void stateChanged(ChangeEvent arg0) { //Each time the spinner changes
  206.                 int spinnerValue = (Integer) spinner.getValue();
  207.                 if (spinnerValue == headerPanel.getComponentCount()) {
  208.                     System.out.println("Error, spinner shouldn't change to same value"); //Was reaching this during some debuging earlier, but not recently
  209.                 }
  210.  
  211.                 if (spinnerValue < headerPanel.getComponentCount()) {
  212.                     headerPanel.removeAll(); //removes all existing JTextFields
  213.                 }
  214.  
  215.                 while (spinnerValue > headerPanel.getComponentCount()) { //Populates headerPanel with JTextFields until spinnerValue == headerPanel.getComponentCount
  216.                     boxesChanged();
  217.  
  218.                     frame.revalidate();
  219.                     frame.repaint();
  220.                 }
  221.             }
  222.         });
  223.  
  224. My boxesChanged() method
  225.  
  226.         public void boxesChanged() { //Runs whenever spinner value != number of JTextPanels in headerPanel
  227.         int hp = headerPanel.getComponentCount();
  228.  
  229.         tField = new JTextField(); //Create JTextField
  230.         textFieldList.add(tField); //adds the current JTextField to ArrayList<JTextField> textFieldList
  231.         tField.setName(nameTField + hp); //sets name of current JTextField to String nameTField + current JTextPanelCount (tFrame0, tFrame1, ...)
  232.  
  233.         tField.getDocument().addDocumentListener(new DocumentListener() { //Adds a listener to each instance of JTextField
  234.  
  235.            //If any changes to JTextField, runs warn()
  236.             public void changedUpdate(DocumentEvent e) {
  237.                 warn();
  238.             }
  239.  
  240.             public void removeUpdate(DocumentEvent e) {
  241.                 warn();
  242.             }
  243.  
  244.             public void insertUpdate(DocumentEvent e) {
  245.                 warn();
  246.             }
  247.  
  248.             public void warn() {
  249.  
  250.                 int digits = 1; //sets the number of digits to subtract from substring
  251.  
  252.                 if (hp > 9) { //if >9 uses 2 didgits, Spinner max is 100, starting at 0, so 99 is max
  253.                     digits = 2;
  254.                 }
  255.  
  256.                 String getFieldString; //String used to hold substring
  257.                 int getFieldNum; //int for parseInt of getFieldString
  258.  
  259.                 getFieldString = tField.getName().substring(tField.getName().length() - digits); //Gets the last digit(s) from tField.getName
  260.  
  261.                 getFieldNum = Integer.parseInt(getFieldString); //Parses substring into int
  262.  
  263.                 headerData = new Object[hp + 1]; //Create headerData with size of number of JTextField +1 (if 0, will instantiate a null array)
  264.  
  265.                 if (tField.getText() != null) { //null check
  266.  
  267.                     headerData[getFieldNum] = tField.getText(); //sets the headerData value to current JTextField's text
  268.  
  269.                     for (int i = 0; i < textFieldList.size(); i++) { //Loop through to see if each text field list contains correct data
  270.                         System.out.println("TFL i :" + i + " " + textFieldList.get(i).getText());
  271.                     }
  272.                 }
  273.             }
  274.         });
  275.  
  276.         headerPanel.add(tField); //Accidentally left this part out of the previous edit, hope it wasn't what was causing my issue
  277.  
  278.     }
  279.  
  280. With this setup if I set the default JTextField to "Box 1" my console output will look like this.
  281.  
  282.    TFL i :0 B
  283.    TFL i :0 Bo
  284.    TFL i :0 Box
  285.    TFL i :0 Box
  286.    TFL i :0 Box 1
  287.    TFL i :0 Box 1
  288.    TFL i :1 B
  289.    TFL i :0 Box 1
  290.    TFL i :1 Bo
  291.    TFL i :0 Box 1
  292.    TFL i :1 Box
  293.    TFL i :0 Box 1
  294.    TFL i :1 Box
  295.    TFL i :0 Box 1
  296.    TFL i :1 Box 2
  297.  
  298. However, this is only if I add data sequentially (tField0 must be filled out before I increase the spinner, then tField1 must be filled out, increase the spinner, etc.).
  299. Otherwise I get an ArrayIndexOutOfBoundsException at
  300.  
  301.    headerData[getFieldNum] = tField.getText();
  302.  
  303.  
  304. Edit 5
  305.  
  306. Variables
  307.  
  308.    private static String nameTField = "tField";
  309.  
  310.    private Object[] headerData;
  311.  
  312.    public String name;
  313.  
  314.     public List<JTextField> findTextFields() {
  315.         List<JTextField> fields = new LinkedList<>();
  316.  
  317.         Component[] children = headerPanel.getComponents();
  318.         // this is your 'search-loop':
  319.         for (Component child : children) {
  320.             if (child instanceof JTextField) {
  321.                 JTextField childField = (JTextField) child;
  322.                 name = childField.getName();
  323.                 if (name.startsWith(nameTField)) {
  324.                     fields.add(childField);
  325.                 }
  326.             }
  327.         }
  328.  
  329.         return fields;
  330.     }
  331.  
  332. public static final Pattern POSTFIX_PATTERN = Pattern.compile(nameTField + "(\\d+)");
  333.  
  334. JSpinner
  335.  
  336.    spinner = new JSpinner();
  337.     spinner.addContainerListener(new ContainerAdapter() {
  338.         @Override
  339.         public void componentAdded(ContainerEvent arg0) {
  340.             boxesRemoved();
  341.             boxesChanged();
  342.             }
  343.     });
  344.     spinner.addChangeListener(new ChangeListener() {
  345.         public void stateChanged(ChangeEvent arg0) {
  346.             int spinnerValue = (Integer) spinner.getValue();
  347.             if (spinnerValue == headerPanel.getComponentCount()) {
  348.                 System.out.println("Error, spinner shouldn't change to same value");
  349.             }
  350.  
  351.             if (spinnerValue < headerPanel.getComponentCount()) {
  352.                 boxesRemoved();
  353.                 frame.revalidate();
  354.                 frame.repaint();
  355.             }
  356.  
  357.             while (spinnerValue > headerPanel.getComponentCount()) {
  358.                 boxesChanged();
  359.  
  360.                 // frame.getContentPane().add(tField);
  361.                 frame.revalidate(); // For JDK 1.7 or above.
  362.                 // frame.getContentPane().revalidate(); // For JDK 1.6 or below.
  363.                 frame.repaint();
  364.             }
  365.         }
  366.     });
  367.  
  368. boxesRemoved() method
  369.  
  370.     public void boxesRemoved() {
  371.         for (JTextField textField : findTextFields()) {
  372.             String name = textField.getName();
  373.             Matcher matcher = POSTFIX_PATTERN.matcher(name);
  374.             if (matcher.matches()) {
  375.                 String strPostfix = matcher.group(1);
  376.                 int postFixNumeric = Integer.parseInt(strPostfix);
  377.  
  378.                 System.out.println("for postFix = " + postFixNumeric + ": " + textField.getText());
  379.                 if (postFixNumeric < findTextFields().size()) {
  380.                     System.out.println("PFN: " + postFixNumeric);
  381.                     System.out.println("FTF: " + findTextFields().size());
  382.                     findTextFields().remove(findTextFields().size() - 1);
  383.                     headerPanel.remove(findTextFields().size() - 1);
  384.                 }
  385.             }
  386.         }
  387.     }
  388.  
  389.  
  390. boxesChanged() method
  391.  
  392.     public void boxesChanged() {
  393.         int hp = headerPanel.getComponentCount();
  394.  
  395.         tField = new JTextField();
  396.         tField.setName(nameTField + hp);
  397.         textFieldList.add(tField);
  398.  
  399.         tField.getDocument().addDocumentListener(new DocumentListener() {
  400.  
  401.             public void changedUpdate(DocumentEvent e) {
  402.                 warn();
  403.             }
  404.  
  405.             public void removeUpdate(DocumentEvent e) {
  406.                 warn();
  407.             }
  408.  
  409.             public void insertUpdate(DocumentEvent e) {
  410.                 warn();
  411.             }
  412.  
  413.             public void warn() {
  414.  
  415.                 int digits = 1;
  416.  
  417.                 if (hp > 9) {
  418.                     digits = 2;
  419.                 }
  420.  
  421.                 String getFieldString;
  422.                 int getFieldNum;
  423.  
  424.                 getFieldString = tField.getName().substring(tField.getName().length() - digits);
  425.  
  426.                 getFieldNum = Integer.parseInt(getFieldString);
  427.  
  428.                 headerData = new Object[hp + 1];
  429.  
  430.                 for (JTextField textField : findTextFields()) {
  431.                     Matcher matcher = POSTFIX_PATTERN.matcher(name);
  432.                     System.out.println(name);
  433.                     if (matcher.matches()) {
  434.                         String strPostfix = matcher.group(1);
  435.                         int postfixNumeric = Integer.parseInt(strPostfix);
  436.  
  437.                         System.out.println("for postfix = " + postfixNumeric + ": " + textField.getText());
  438.                     } else {
  439.                         System.out.println("matcher error: " + matcher);
  440.                     }
  441.                 }
  442.             }
  443.         });
  444.  
  445.         headerPanel.add(tField);
  446.  
  447.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement