使用这个网站很多,但第一次张贴。我计划创建一个数量按钮根据的数量记录在文件中。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();
                }
                });
               }
            }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top