2015-01-08 3 views
0

Я думаю, что это неправильно. Я хочу, чтобы мой код добавлял actionlistener, как только кнопка была создана. Есть ли способ сделать это динамически. смотреть на внутреннем цикл у меня есть проблема, добавив тудаДинамическое добавление прослушивателя действий к кнопкам

import java.awt.*; 
import java.applet.*; 
import java.util.*; 
import java.awt.event.*; 

/* <applet code = "Gridl.java" width=300 height=200> 
    </applet> */ 

public class Gridl extends Applet 
{ 
    TextField t1=new TextField(" "); 

    public void init() 
    { 
     int n = 1; 
     setLayout(new GridLayout(4,4)); 
     add(t1); 
     setFont(new Font("Tahoma",Font.BOLD,24)); 

     for(int i=0;i<4;i++) 
     { 
      for(int j=0;j<4;j++) 
      { 
       add(new Button(""+n));   
       this.addActionListener(this);  // this didnt work :(
       n++; 
      } 
     } 
    } 

    public void actionPerformed(ActionEvent ae) 
    { 
     String str = ae.getActionCommand(); 
     t1.setText(str); 
    } 

} 
+1

Прочитайте основные документы Java по использованию AWT. – BarrySW19

+0

Пожалуйста, отформатируйте свой код. – m0skit0

+0

ok я буду форматировать –

ответ

0

Я думаю, что у вас есть некоторые концептуальные недоразумения, отраженные в вашем коде здесь. Важно рассмотреть, на какой компонент вы добавляете ActionListener. На данный момент ваш код добавляет ActionListener к объекту Gridl, расширяющему апплет, а не к самой кнопке. Он не будет бросать исключение, потому что это действительно, но это не даст вам поведение, которое вы хотите

Чтобы вы работаете, я предлагаю вам заменить

add(new Button(""+n)); 

с

Button b = new Button(""+n); 
b.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent e) 
    { 
     System.out.println("You clicked button "+e.getSource().toString()); 
    } 
}); 

this.add(b); 

Обратите внимание, что это устанавливает новый ActionListener для каждого объекта Button, его поведение определяется тем, что вы положили в методе actionPerformed(). Вы можете иметь одинаковое поведение для всех кнопок или для каждого из них.

Я бы предположил, что вы, возможно, захотите прочитать учебники GUI оракула Java Swing, в частности, one on actions. Там есть образцы кода.

EDIT:

Я понял, что вы можете иметь ваш Gridl быть слушателем для всех кнопок. В этом случае - вы можете достичь этого:

public class Gridl extends Applet implements ActionListener 
{ 
    TextField t1=new TextField(" "); 

    public void init() 
    { 
     int n = 1; 
     setLayout(new GridLayout(4,4)); 
     add(t1); 
     setFont(new Font("Tahoma",Font.BOLD,24)); 

     for(int i=0;i<4;i++) 
     { 
      for(int j=0;j<4;j++) 
      { 
       Button b = new Button(""+n));   
       b.addActionListener(this); 
       this.add(b); 
       n++; 
      } 
     } 
    } 

    public void actionPerformed(ActionEvent ae) 
    { 
     String str = ae.getActionCommand(); 
     t1.setText(str); 
    } 

} 
+0

спасибо, что было полезно, но это this.add (b); действительно необходимо, я хочу добавить (b); разве этого недостаточно? –

+0

Да - 'add (b);' будет достаточно - 'this' подразумевается тогда. Мне нравится держать явное 'this.' при работе с swing, чтобы не добавлять вещи к неправильному компоненту и т. Д. Не стесняйтесь повышать/принимать, если он делает то, что вы хотите :) –

+0

так это. для всего домашнего хозяйства –

0

попробовать, как это при создании новой кнопки(). добавить, не прекращая это утверждение.

new Button("").addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e) 
     { 
      //Execute when button is pressed 
      System.out.println("You clicked the button"); 
     } 
    });  
+0

как я могу создать абстрактный класс в вашем примере? –

Смежные вопросы