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