具有不同的动作为每个按钮动态创建在一个循环
-
19-09-2019 - |
题
使用这个网站很多,但第一次张贴。我计划创建一个数量按钮根据的数量记录在文件中。E.g。5记录,5按钮。
这些按钮是被创造,但我有一个问题与该行动的听众。
如果添加行动的监听器的循环每一个按钮做同样的事情;但是,如果我添加行动的监听器之外的循环,它只是增加了行动,听到最后一个按钮。
任何想法?
这里是我有什么代码-明智的(我只是增加了用于环保存空间):
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++;
}
非常感激
解决方案
因为你创造一种动听的每一个按钮,你创建的,你可能有这样的:
final int buttonIndex = i;
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae2) {
System.out.println("Button pressed is: " + buttonIndex);
}
}
访问一变量内部的一个匿名的类方法,它必须标志着最终的。那是什么你有了这些 final int buttonIndex = i;
发言。
你可以使用 setActionCommand
方法上的按钮,以界定行动的命令到它,你可以检索从 actionCommand 酒店的 ActionEvent
类。通过这样做,你可以有同样的监听你所有的按钮。你可以设定行动命令 buttonIndex
变量那我定义的例子。通过这样做,你创建小匿名类在应用程序,这始终是很好(较少的对象,消耗较少的存储器)。
其他提示
您可以与您正在创建它们每个按键的按键参考和索引(i
)添加到哈希映射。
在你的一个动作监听器,你可以看一下,通过其按键的参考源在HashMap中的事件按钮的索引。
是这样的(伪代码,所以请不要downvote我,如果它不编译):
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++;
}
为什么不设置你的循环外的ActionListeners和使它们的阵列,其中,在听众阵列的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]);
}
警告虽然,我还没有测试此代码。
您第一问题在于与可变j
的依赖。
你在增量的时间分配给所有的按钮完全一样的ActionListener,这将在指数j
,这在当时被显示的按钮打印出来的对象是==列表的最后一个索引,列表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();
}
});
}
}
}