2017-03-24 3 views
0

Ich kann nicht einen Weg finden, um ein Array zu verwenden (in diesem Fall containerinput []) outide des Ereignis-Listener ist es in.Java- Benutzer Array außerhalb des Ereignis-Listener

Im Fall Zuhörer i erzeugen Textfelder, Eingabefelder und so weiter, und außerhalb davon möchte ich einen Keylistener machen, dass wenn das letzte Eingabefeld ausgewählt ist und ich Tab drücke, will ich, dass etwas passiert.

Alles funktioniert, außer dass ich das Array nennen kann nicht, weil seine außerhalb des Rahmens und ich kann nicht einen Weg, das zu ändern :(Das ist das Ereignis das Array in ist:

JPanel zusatzPanel = new JPanel(); 
zusatzPanel.setBounds(11, 291, 270, 113); 
contentPane2.add(zusatzPanel); 
zusatzPanel.setLayout(null); 

int[] ZusatzpanelCase = new int [300]; 
ZusatzpanelCase[1] = 0; 

comboBox_projekt.addActionListener (new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     zusatzPanel.removeAll();  
     for(int key = 0; key < ObjektlängeForActionListener; key++){ 
      if(comboBox_projekt.getSelectedItem() == null){ 
       zusatzPanel.removeAll();  
       zusatzPanel.revalidate(); 
       zusatzPanel.repaint(); 
       break; 
      }else{ 
       if(comboBox_projekt.getSelectedItem().equals(Projektname0JSON[key])){ 
        zusatzPanel.removeAll();  
        zusatzPanel.revalidate(); 
        zusatzPanel.repaint(); 

        String ZusatzString; 
        try { 
         ZusatzString = SimplePingPong.httpRequestZusatz(ProjektPK0JSON[key],"unused","zusatz"); 
         if(ZusatzString.equals("Keine Werte")){ 
          ZusatzpanelCase[1] = 0; 

         }else{ 
          JSONObject jsonObjectZusatz = new JSONObject(ZusatzString); 
          int ZusatzJSONlength = jsonObjectZusatz.length(); 
          int xValue = 0; 
          JTextField[] containerinput = new JTextField[ZusatzJSONlength]; 
          JComboBox[] containerselect = new JComboBox[ZusatzJSONlength]; 
          JLabel[] containerlabel = new JLabel[ZusatzJSONlength]; 

          for(int key1 = 0; key1 < ZusatzJSONlength; key1++){ 
           JSONObject jsonObjectZusatzObjekt0 = jsonObjectZusatz.getJSONObject(String.valueOf(key1)); 
           String ZusatzNameJSON = jsonObjectZusatzObjekt0.getString("name"); // String auslesen!!! 
           String ZusatzTypJSON = jsonObjectZusatzObjekt0.getString("typ"); // String auslesen!!! 
           String ZusatzEintragJSON = jsonObjectZusatzObjekt0.getString("eintrag"); // String auslesen!!! 

; 


                if(ZusatzTypJSON.equals("input")){ 
            containerinput[key1] = new JTextField(); 
            containerinput[key1].setBounds(108, xValue, 136, 20); 
            zusatzPanel.add(containerinput[key1]); 
            containerinput[key1].setColumns(10); 
           } 
           if(ZusatzTypJSON.equals("select")){ 
            containerselect[key1] = new JComboBox(); 
            containerselect[key1].setBounds(108, xValue, 136, 20); 
            zusatzPanel.add(containerselect[key1]); 
           } 
           containerlabel[key1] = new JLabel(ZusatzNameJSON); 
           containerlabel[key1].setFont(new Font("Tahoma", Font.PLAIN, 15)); 
           containerlabel[key1].setBounds(1, xValue + 1, 100, 15); 
           zusatzPanel.add(containerlabel[key1]); 

           ZusatzpanelCase[1] = 1; 
           ZusatzpanelCase[2] = ZusatzpanelCase[2] + 1; 

           xValue = xValue + 30; 
           zusatzPanel.revalidate(); 
           zusatzPanel.repaint(); 
          } 




         } 
        } catch (IOException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
        } 



       } 

      } 
     } 


    } 
}); 

und hier i will die Schlüssel Zuhörer machen.

containerinput[ZusatzpanelCase[2]].setFocusTraversalKeysEnabled(false); 
containerinput[ZusatzpanelCase[2]].addKeyListener(new KeyAdapter() { 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_TAB){ 
       String dauervar = input_dauer.getText(); //auslesen von benutzername 
       String beschreibungvar = textArea_beschreibung.getText(); //auslesen von benutzername 
       String projektvar = (String)comboBox_projekt.getSelectedItem(); 
       String aktivitvar = (String)comboBox_aktivitaet.getSelectedItem(); 

       String datumvar = input_datum.getText(); 
       SimpleDateFormat df1 = new SimpleDateFormat("dd/MM/yyyy"); 
       Date date = null; 
       try { 
        date = df1.parse(datumvar); 
       } catch (ParseException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
       long epoch = date.getTime(); 
       String numberAsStringUnixTImestamp = String.valueOf(epoch/1000); 

       String [ ] datenarray = {"a","b","c","d","e","f"}; 

       datenarray[0] = numberAsStringUnixTImestamp; 
       datenarray[1] = dauervar; 
       datenarray[2] = beschreibungvar;  
       datenarray[3] = projektvar; 
       datenarray[4] = aktivitvar; 
       datenarray[5] = usernamevar;  

       String JsonArray = "{ \"" + "datum" + "\":\"" + datenarray[0] + "\", \"" + "dauer" + "\":\"" + datenarray[1] + "\", \"" + "beschreibung" + "\":\"" + datenarray[2] + "\", \"" + "projektname" + "\":\"" + datenarray[3] + "\", \"" + "kategorie" + "\":\"" + datenarray[4] + "\", \"" + "username" + "\":\"" + datenarray[5] + "\" }"; 
       System.out.println(JsonArray); 

       input_datum.setText(reportDate); 
       if(check_datum.isSelected()){ 
        CustomDateFinal[0] = datumvar; 
        input_datum.setText(CustomDateFinal[0]); 

       }        
       input_dauer.setText(USERDefTimeJSON); 
       textArea_beschreibung.setText(""); 
       comboBox_projekt.requestFocus(); 


       try { 
        SimplePingPong.httpRequestVoid(JsonArray,"unused","werte"); 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 

     } 

    } 
});  

Wie kann ich meine containerinput machen [] sichtbar außerhalb oder ist es eine Abhilfe

Dank im Voraus :)

+0

Wo möchten Sie auf containerinput [] 'zugreifen? Liegt es außerhalb der 'Klasse'? oder innerhalb der Klasse, aber außerhalb der Methode in derselben Klasse? –

+0

Sie befindet sich außerhalb des Ereignishandlers in derselben Klasse. –

Antwort

0

Sie benötigen containerinput Array außerhalb des Ereignishandler erklären z.B. auf Klassenebene und initialisiere sie in deinem Event-Handler.

Ihr aktualisiertes Code Beispiel

JPanel zusatzPanel = new JPanel(); 
zusatzPanel.setBounds(11, 291, 270, 113); 
contentPane2.add(zusatzPanel); 
zusatzPanel.setLayout(null); 

JTextField[] containerinput; //like that 
JComboBox[] containerselect; //like that 
JLabel[] containerlabel;  //like that 

int[] ZusatzpanelCase = new int [300]; 
ZusatzpanelCase[1] = 0; 

comboBox_projekt.addActionListener (new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     zusatzPanel.removeAll();  
     for(int key = 0; key < ObjektlängeForActionListener; key++){ 
      if(comboBox_projekt.getSelectedItem() == null){ 
       zusatzPanel.removeAll();  
       zusatzPanel.revalidate(); 
       zusatzPanel.repaint(); 
       break; 
      }else{ 
       if(comboBox_projekt.getSelectedItem().equals(Projektname0JSON[key])){ 
        zusatzPanel.removeAll();  
        zusatzPanel.revalidate(); 
        zusatzPanel.repaint(); 

        String ZusatzString; 
        try { 
         ZusatzString = SimplePingPong.httpRequestZusatz(ProjektPK0JSON[key],"unused","zusatz"); 
         if(ZusatzString.equals("Keine Werte")){ 
          ZusatzpanelCase[1] = 0; 

         }else{ 
          JSONObject jsonObjectZusatz = new JSONObject(ZusatzString); 
          int ZusatzJSONlength = jsonObjectZusatz.length(); 
          int xValue = 0; 
          containerinput = new JTextField[ZusatzJSONlength]; 
          containerselect = new JComboBox[ZusatzJSONlength]; 
          containerlabel = new JLabel[ZusatzJSONlength]; 

          for(int key1 = 0; key1 < ZusatzJSONlength; key1++){ 
           JSONObject jsonObjectZusatzObjekt0 = jsonObjectZusatz.getJSONObject(String.valueOf(key1)); 
           String ZusatzNameJSON = jsonObjectZusatzObjekt0.getString("name"); // String auslesen!!! 
           String ZusatzTypJSON = jsonObjectZusatzObjekt0.getString("typ"); // String auslesen!!! 
           String ZusatzEintragJSON = jsonObjectZusatzObjekt0.getString("eintrag"); // String auslesen!!! 

; 


                if(ZusatzTypJSON.equals("input")){ 
            containerinput[key1] = new JTextField(); 
            containerinput[key1].setBounds(108, xValue, 136, 20); 
            zusatzPanel.add(containerinput[key1]); 
            containerinput[key1].setColumns(10); 
           } 
           if(ZusatzTypJSON.equals("select")){ 
            containerselect[key1] = new JComboBox(); 
            containerselect[key1].setBounds(108, xValue, 136, 20); 
            zusatzPanel.add(containerselect[key1]); 
           } 
           containerlabel[key1] = new JLabel(ZusatzNameJSON); 
           containerlabel[key1].setFont(new Font("Tahoma", Font.PLAIN, 15)); 
           containerlabel[key1].setBounds(1, xValue + 1, 100, 15); 
           zusatzPanel.add(containerlabel[key1]); 

           ZusatzpanelCase[1] = 1; 
           ZusatzpanelCase[2] = ZusatzpanelCase[2] + 1; 

           xValue = xValue + 30; 
           zusatzPanel.revalidate(); 
           zusatzPanel.repaint(); 
          } 




         } 
        } catch (IOException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
        } 



       } 

      } 
     } 


    } 
}); 

Jetzt können Sie dann innerhalb class überall darauf zugreifen.

+0

abfragen Ich bekomme den Fehler: Lokale Variable containerinput definiert in einem umschließenden Bereich muss endgültig oder effektiv endgültig sein. es ändert sich nicht, wenn ich es endgültig festlege .. –

0

Sie möchten, dass es draußen sichtbar ist, also warum definieren Sie es nicht außerhalb und nicht innerhalb des Hörers?

es dort definieren, wo Sie diese bereits haben:

JPanel zusatzPanel = new JPanel(); 
0

containerinput Machen Sie ein privates Mitglied Ihrer Klasse (deklarieren es außerhalb jeder Klasse-Funktion).

Es steht dann (nur) den Klassenmethoden zur Verfügung.

Sie können außerhalb der Klasse Sichtbarkeit von containerinput steuern mit protected oder public Modifikatoren:

  • protected wird es zu Unterklassen und anderen Klassen im selben Paket sichtbar machen.
  • public wird es für jede Klasse sichtbar machen.
+0

Ich kann dies nicht tun, weil ich brauche es eine bestimmte Länge zu haben, und ich habe nur Zugriff auf diese Länge im Event-Handler traurig –

+0

Verwenden Sie eine ArrayList, wenn Sie nicht wissen, die Länge bei der Initialisierung der Klasse. Es kann dynamisch wachsen und Sie können die Länge mit .size() – Edd

Verwandte Themen