使用这个网站很多,但第一次发布。 我的程序根据文件中的记录数创建了许多按钮。 例如。 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++;
}
备受赞赏
答案 0 :(得分: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
方法为其定义一个操作命令,您可以从ActionEvent
类的actionCommand属性中检索该命令。通过这样做,您可以为所有按钮设置相同的监听器。您可以将该操作命令设置为我在示例中定义的buttonIndex
变量。通过这样做,您可以在应用程序中创建较少的匿名类,这总是很好(较少的对象消耗较少的内存)。
答案 1 :(得分: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 it's index
Integer index = map.get( ae2.getSource() );
// Do something different here based upon index
}
});
j++;
}
答案 2 :(得分: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]);
}
但是警告,我还没有测试过这段代码。
答案 3 :(得分:0)
您的第一个问题在于依赖变量j
。
您正在为所有按钮分配完全相同的ActionListener,它会打印索引j
处的对象,在显示按钮时= =当时列表的最后一个索引列表namesA
的增量。
答案 4 :(得分: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();
}
});
}
}
}