Warum wird die Methode nicht aufgerufen?

Status
Nicht offen für weitere Antworten.

bristtote

Aktives Mitglied
Hallo,


ich erzeuge in meiner Hauptklasse ein Objekt der inneren Klasse.
Bis auf einer Sache klappt alles ganz gut. Das Problem ist die Methode "rufItem". Diese soll überprüfen, ob sich an dem Status der Choices etwas verändert hat. ist dann z.B.
Code:
 ItemEvent.SELECTED == 1
dann werden neue Choices erstellt. Das Problem ist hierbei nun, dass Choices zwar erstellt werden, aber sofort nach 1 Sekunde wieder verschwinden. Dieses Problem ist gelöst, wenn ich sowohl die Methode "rufItem" , als auch die Methode "aendere" direkt in der Hauptklasse initialisiere. Ich weiss jetzt nicht, was ich genau falsch gemacht habe. Bitte helft mir :roll:
Wenn Ihr etwas nicht versteht, dann fragt bitte und geht nicht einfach weg, danke
Hier der Code:

Code:
public class Test extends Applet
{   
   HauptPanel p= new HauptPanel();   
   
   public void   init()
   {      
   add(p);
   setBackground(p.bgCo);      
   }
   
}

class HauptPanel extends Panel
{   

    Color bgCo        = new Color(158,158,158);   
    Button buttonL    = new Button("Los");
    TextField t       = new TextField(8);
    Panel panel    [] = new Panel[12];
    String items   [] = {"NOP", "ADD", "LOAD"};
    Choice choices [] = new Choice [11];
    Choice c1      [] = new Choice [11];
    Choice c2      [] = new Choice [11];
    Choice cerg    [] = new Choice [11];
    Label labels   [] = new Label[11];
    Label gleich   [] = new Label[11];
    Label plus     [] = new Label[11];
    String g          ="="; 
    String p          ="+";   
   
    HauptPanel()
    {      
   setLayout(new GridLayout(0,1));
   setBackground(bgCo);   
   panelsEinfuegen();
        labelsEinfuegen();
       choicesEinfuegen();
       panel[11].add(buttonL);
       panel[11].add(t);   
       rufItem();       
    }   
   
    public void panelsEinfuegen()
    {
       for (int i=0; i<panel.length; i++)
   {
          panel[i]=new Panel();
          add(panel[i]);     
       }
   
    }   
       
    public void choicesEinfuegen()
    {
       for (int i=0; i<choices.length; i++)
   {          
           choices[i] = new Choice();        
           choices[i].addItem(items [0]);
          choices[i].addItem(items [1]); 
           choices[i].addItem(items [2]);
            panel[i].add(choices[i]);
        }
       
    }
   
    public void labelsEinfuegen()
    {
       for (int i=0; i<labels.length; i++)
      {
      labels[i]=new Label(String.valueOf(i));
      gleich[i] =new Label(g);
          plus[i] =new Label(p);
          panel[i].add(labels[i]);
      }          
    }
   
   public void rufItem()
   {      
      for ( int i=0; i<choices.length; i++)
      {
          final int index = i;
          choices[i].addItemListener(new ItemListener()
         {
             public void itemStateChanged(ItemEvent e)
             {
     
                 if ( ItemEvent.SELECTED == 1)
                 {
                     aendere( index, e.getItem() );
                }
             }
           });
      }   
      
   }
      public void aendere( int index, Object item )
   {
  // wird immer aufgerufen, wenn "choice" ein neues "item" selektiert hat. Das item kann auch null sein!
       if(item.equals("ADD"))
       {       
              if (cerg[index]!=null)
            {
                  panel[index].remove(cerg[index]);
                 panel[index].remove(gleich[index]);
                  panel[index].remove(plus[index]);         
                  panel[index].remove(c1[index]);
                  panel[index].remove(c2[index]);     
                   
                 }

            c1[index]  = new Choice();
             c2[index]  = new Choice();
             cerg[index]= new Choice();
             gleich[index] = new Label("=");
             plus[index]= new Label("+");
          
          c1[index].add("R 0");
          c1[index].add("R 1");

          
          c2[index].add("R 0");
          c2[index].add("R 1");

          
          cerg[index].add("R 1");
          cerg[index].add("R 2");

          
          
          panel[index].add(cerg[index]);
          panel[index].add(gleich[index]);     
          panel[index].add(c1[index]);
          panel[index].add(plus[index]);
          panel[index].add(c2[index]);   
         }
     
       else if(item.equals("LOAD"))..........................// Hier geht es weiter mit den anderen beiden Items LOAD und NOP
     
         
      repaint();
      validate();
   }
}
 
Alles, was ich wissen möchte ist, warum die Methode rufItem nicht richtig aufgeführt wird.
Kommt keiner darauf :cry: bitte
 
Hi,

Deine Lösung habe ich ausprobiert, leider kommt folgende Fehlermeldung
Code:
D:\.........................l\Test.java:115: local variable i is accessed from within inner class; needs to be declared final
                     aendere( i, e.getItem() );

Aber ich muss dazu sagen, dass alle funktioniert (zumindest bei meiner Version), wenn ich die Methode "aendere" und "rufItem" direkt in der Hauptklasse initialisiere.
Was bei der ganzen Sache falsch läuft ist, dass die Choices, die erzeugt werden, nach 1 Sekunde vom Applet verschwinden. Sie sollten ja eigenltich da bleiben.
 
Ich habs mal kompiliert und ausgeführt. Habe das Problem gesehen, weiß aber nicht so richtig wie du das oder was du haben willst.
 
Cool, danke, das finde ich nett von Dir.

Also nach dem Du halt ein Item gewählt hast, wie z.B. "ADD" oder "LOAD" sollen sich dann zwei weitere Choices neben der ersten Choice öffnen. Diese sollen aber nicht sofort verschwinden. Also, so sollte es aussehen:


choice-ok.bmp
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben