3

经常使用这个网站,但第一次发帖。我的程序根据文件中的记录数创建许多按钮。例如 5 条记录,5 个按钮。

正在创建按钮,但我遇到了动作侦听器的问题。

如果在循环中添加动作监听器,每个按钮都会做同样的事情;但是如果我在循环之外添加动作监听器,它只会将动作监听器添加到最后一个按钮。

有任何想法吗?

这是我在代码方面的内容(我刚刚添加了 for 循环以节省空间):

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++;
}

非常感激

4

5 回答 5

3

当您为正在创建的每个按钮创建一个动作侦听器时,您可以这样:

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

要访问匿名类方法中的变量,必须将其标记为 final。这就是你的final int buttonIndex = i;说法。

您可以使用setActionCommand按钮上的方法为其定义一个操作命令,您可以从类的actionCommand属性中检索该操作命令ActionEvent。通过这样做,您可以为所有按钮使用相同的侦听器。您可以将该操作命令设置为buttonIndex我在您的示例中定义的变量。通过这样做,您可以在应用程序中创建更少的匿名类,这总是好的(更少的对象消耗更少的内存)。

于 2010-03-12T02:05:59.910 回答
2

i您可以在创建它们时将每个按钮的按钮引用和索引 ( ) 添加到哈希映射中。

在您的一个动作侦听器中,您可以通过按钮引用在哈希图中查找引发事件的按钮的索引。

像这样的东西(伪代码,所以如果它不能编译,请不要对我投反对票):

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 its index
            Integer index = map.get( ae2.getSource() );

            // Do something different here based upon index
        }
    });
    j++;
}
于 2010-03-12T02:04:51.613 回答
1

为什么不在循环之外设置您的 ActionListener 并创建一个数组,其中您的 listeners 数组中的 actionListener 的索引对应于它被添加到的按钮。像这样的东西:

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]);
}

不过警告,我还没有测试过这段代码。

于 2010-03-12T02:01:49.397 回答
0

您的第一个问题在于对 variable 的依赖j

您正在为所有按钮分配完全相同的 ActionListener,这将打印出 indexj处的对象,在显示按钮时,它是 == List 增量时列表的最后一个索引namesA

于 2010-03-12T02:12:17.727 回答
0
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();
                }
                });
               }
            }
}
于 2012-09-03T15:58:08.520 回答