Frage

Verwenden Sie diese Website viel, aber zum ersten Mal. Mein Programm erstellt eine Reihe von Schaltflächen, abhängig von der Anzahl der Datensätze in einer Datei. ZB 5 Datensätze, 5 Tasten.

Die Schaltflächen werden erstellt, aber ich habe ein Problem mit dem Action -Hörer.

Wenn Sie den Action -Listener in der Schleife hinzufügen, tut jede Taste dasselbe. Wenn ich den Action -Listener jedoch außerhalb der Schleife hinzufüge, fügt er den Action -Listener nur zum letzten Taste hinzu.

Irgendwelche Ideen?

Hier ist, was ich in Bezug auf den Code habe (ich habe gerade die für Schleife hinzugefügt, um Platz zu sparen):

int j=0;
for(int i=0; i<namesA.size(); i++)
{
    b = new JButton(""+namesA.get(i)+"");
    conPanel.add(b);
    conFrame.add(conPanel);

    b.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ae2){

                System.out.println(namesA.get(j));

        }
    }});
    j++;
}

Sehr geschätzt

War es hilfreich?

Lösung

Während Sie einen Action -Listener für jeden Schaltfläche erstellen, den Sie erstellen, können Sie Folgendes haben:

final int buttonIndex = i;
b.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent ae2) {
       System.out.println("Button pressed is: " + buttonIndex);
   }
}

Um in einer anonymen Klassenmethode auf eine Variable zuzugreifen, muss sie endgültig gekennzeichnet werden. Das hast du das final int buttonIndex = i; Aussage.

Du kannst den ... benutzen setActionCommand Methode auf der Taste, um einen Aktionsbefehl zu definieren, den Sie von der abrufen können ActionCommand Eigentum des ActionEvent Klasse. Auf diese Weise könnten Sie denselben Hörer für alle Ihre Tasten haben. Sie könnten diesen Aktionsbefehl auf die festlegen buttonIndex Variable, die ich in Ihrem Beispiel definiert habe. Auf diese Weise erstellen Sie weniger anonyme Klasse in Ihrer Anwendung, was immer gut ist (weniger Objekte, die weniger Speicher verbrauchen).

Andere Tipps

Sie können die Schaltflächenreferenz und den Index hinzufügen (Index (i) jeder Schaltfläche zu einer Hash -Karte, während Sie sie erstellen.

In Ihrem One -Action -Listener können Sie den Index der Schaltfläche nachschlagen, die das Ereignis in Ihrem HashMap durch die Button -Referenz bezogen.

So etwas (Pseudo -Code, also duntergibt mich nicht, wenn er nicht kompiliert wird):

Hashmap<JButton, Integer> map = new Hashmap<JButton, Integer>();

int j=0;
for (int i = 0; i < namesA.size(); i++)
{
    b = new JButton("" + namesA.get(i) + "");
    conPanel.add(b);
    conFrame.add(conPanel);

    // Add a mapping
    map.add(b, new Integer(i));

    b.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae2) {
            // Look up the button in the map, and get it's index
            Integer index = map.get( ae2.getSource() );

            // Do something different here based upon index
        }
    });
    j++;
}

Richten Sie Ihre ActionListener außerhalb der Schleife ein und erstellen Sie eine Reihe von ihnen, wobei der Index des ActionListener in Ihrem Hörer -Array der Schaltfläche entspricht, zu der er hinzugefügt wird. Etwas wie das:

ActionAdapter[] listeners = new ActionAdapter[namesA.size()];
//fill listeners with ActionAdapters
listeners[0] = new ActionAdapter() 
{
    public void actionPerformed(ActionEvent e) {
        //Do stuff
    }
};
//Repeat for each button you need

for(int i = 0; i < namesA.size(); i++)
{
    b = new JButton("" + namesA.get(i) + "");
    conPanel.add(b);
    b.addActionListener(listeners[i]);
}

Warnung, ich habe diesen Code jedoch nicht getestet.

Ihr erstes Problem liegt bei der Abhängigkeit von Variablen j.

Sie weisen allen Schaltflächen genau das gleiche ActionListener zu, das das Objekt beim Index ausdrucken würde j, welche zum Zeitpunkt der angezeigten Schaltflächen ist == der letzte Index der Liste zum Zeitpunkt der Inkremente, der Liste namesA.

public class Scroll_view extends Activity {

Button btn;
Button btn1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scroll_view);



        LinearLayout linear=(LinearLayout)findViewById(R.id.linear);
        for(int i=1; i<=20 ;i++){
            LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
            btn=new Button(this);
            btn.setId(i);
            final int id_=btn.getId();
            btn.setText("button " + id_);
            linear.addView(btn,params);


            btn1=((Button)findViewById(id_));
            btn1.setOnClickListener(new View.OnClickListener(){         
                public void onClick(View view){
                    Toast.makeText(view.getContext() , "Button clicked index = " + id_ , Toast.LENGTH_SHORT).show();
                }
                });
               }
            }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top