Java 对循环中动态创建的每个按钮具有不同的操作

Java 对循环中动态创建的每个按钮具有不同的操作,java,for-loop,jbutton,actionlistener,Java,For Loop,Jbutton,Actionlistener,经常使用这个网站,但第一次发布。 我的程序根据文件中记录的数量创建许多按钮。 例如,5条记录,5个按钮 正在创建按钮,但操作侦听器有问题 如果在循环中添加操作侦听器,则每个按钮都会执行相同的操作;但是如果我在循环外添加了动作监听器,它只会将动作监听器添加到最后一个按钮 有什么想法吗 以下是我在代码方面的经验(我刚刚添加了for循环以节省空间): intj=0; 对于(int i=0;i为什么不在循环外设置actionListener并制作一个数组,其中listeners数组中actionList

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

正在创建按钮,但操作侦听器有问题

如果在循环中添加操作侦听器,则每个按钮都会执行相同的操作;但是如果我在循环外添加了动作监听器,它只会将动作监听器添加到最后一个按钮

有什么想法吗

以下是我在代码方面的经验(我刚刚添加了for循环以节省空间):

intj=0;

对于(int i=0;i为什么不在循环外设置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]);
}
ActionAdapter[]侦听器=新的ActionAdapter[namesA.size()];
//用ActionAdapters填充侦听器
侦听器[0]=新的ActionAdapter()
{
已执行的公共无效操作(操作事件e){
//做事
}
};
//对所需的每个按钮重复此操作
对于(int i=0;i

不过警告,我尚未测试此代码。

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

在单操作侦听器中,可以通过按钮引用在hashmap中查找源于事件的按钮的索引

类似这样的东西(伪代码,所以如果它不编译,请不要否决我):

Hashmap map=newhashmap();
int j=0;
对于(int i=0;i
当您为所创建的每个按钮创建一个操作侦听器时,您可以有以下功能:

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

您的第一个问题在于依赖变量
j

您正在为所有按钮分配完全相同的ActionListener,它将在索引
j
处打印对象,在按钮显示时,该对象是==列表
名称a

公共类滚动视图扩展活动时列表的最后一个索引{
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();
                }
                });
               }
            }
}
按钮btn; 按钮btn1; @凌驾 创建时的公共void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity\u scroll\u视图); LinearLayout linear=(LinearLayout)findViewById(R.id.linear);
对于(int i=1;这很好。谢谢,但我仍然有一个问题,因为我不知道需要多少个按钮…可能是5…可能是100这个(android)答案与op有什么关系,谁没有要求android解决方案?
final int buttonIndex = i;
b.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent ae2) {
       System.out.println("Button pressed is: " + buttonIndex);
   }
}
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();
                }
                });
               }
            }
}