2013-02-16 2 views
1

Здесь я хотел выполнить действие при нажатии кнопки, это довольно просто, но главная проблема заключается в том, что он должен выполняться в расширенном JPanel. Возможно, это простое решение, например, добавить слушателя действий к этой конкретной кнопке и вызвать событие, связанное с действием, но мой случай не такой, у меня есть 4 кнопки (t1, t2, t3, t4), все эти кнопки должны работать в одном Событие ActionPerfomed ae (посмотрите сегмент кода). И позже вы можете увидеть код, который вызывает другие JButtons tr и rf, вызывающие actionlistener и события, связанные с событиями.Выполнение ActionListener в JPanel

для ясного понятности вы можете иметь взгляд на код ...

class Tracker extends JPanel 
{ 

public static void main(String[] args) { 
    new Tracker(); } 

public Tracker() 
{ 

JButton tr=new JButton("TRACKER APPLET"); 
tr.setBounds(720,170,100,20); 

JButton rf=new JButton("REFRESH"); 
rf.setBounds(200,170,100,20); 

boolean tc1=false,tc2=false,tc3=false,tc4=false; 

JButton t1=new JButton(" "); 
t1.addActionListener(this); 
JButton t2=new JButton(" "); 
t2.addActionListener(this); 
JButton t3=new JButton(" "); 
t3.addActionListener(this); 
JButton t4=new JButton(" "); 
t4.addActionListener(this); 


public void actionPerformed(ActionEvent ae) 
{ 
    if(ae.getSource()==t1) 
    { 
      tc1=true; 
    } 
    if(ae.getSource()==t2) 
    { 
      tc2=true; 
    } 
    if(ae.getSource()==t3) 
    { 
      tc3=true; 
    } 
    if(ae.getSource()==t4) 
    { 
      tc4=true; 
    } 

} 


tr.addActionListener(new ActionListener(){ 
public void actionPerformed(ActionEvent e){ 

    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException ex){} 
      catch(InstantiationException ex){} 
      catch(IllegalAccessException ex){} 
      catch(UnsupportedLookAndFeelException ex) {} 

       //some food here.... 


          } 
         }); 
      } 
      });   

    rf.addActionListener(new ActionListener(){ 
public void actionPerformed(ActionEvent e){ 

    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() 
     { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } 
      catch (ClassNotFoundException ex){} 
      catch(InstantiationException ex){} 
      catch(IllegalAccessException ex){} 
      catch(UnsupportedLookAndFeelException ex) {} 
         //some extra work runs here... 
     } 
    }); 
} 
    }); 
add(tr); 
add(rf); 
add(t1); 
add(t2); 
add(t3); 
add(t4); 
} 

Моя проблема здесь я не мог реализовать ActionListener в качестве основного класса уже простирающейся JPanel. Я просто пытаюсь работать с Jbuttons :: хотел выполнить одно действие, когда кнопки (t1 | t2 | t3 | t4) и JButtons (tr | rf) нажаты в хронологическом порядке.

заранее спасибо ..

+1

Смотрите также [* Как использовать действия *] (Http: //docs.oracle.com/javase/tuto риал/uiswing/разные/action.html). – trashgod

+0

Есть ли необходимость в расширении 'JPanel'? я не могу просто использовать экземпляр и добавить кнопки и т. д., как это –

ответ

1
class Tracker extends JPanel implements ActionListener 

Ваш код содержит некоторые методы в методы ...

Этот код работает:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Tracker extends JPanel implements ActionListener { 
    public Tracker() { 
     tr.setBounds(720, 170, 100, 20); 
     tr.addActionListener(this); 

     rf.setBounds(200, 170, 100, 20); 
     rf.addActionListener(this); 

     t1.addActionListener(this); 
     t2.addActionListener(this); 
     t3.addActionListener(this); 
     t4.addActionListener(this); 
     add(tr); 
     add(rf); 
     add(t1); 
     add(t2); 
     add(t3); 
     add(t4); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Object src = e.getSource(); 
     if(src == t1) { 
     tc1 = true; 
     } 
     else if(src == t2) { 
     tc2 = true; 
     } 
     else if(src == t3) { 
     tc3 = true; 
     } 
     else if(src == t4) { 
     tc4 = true; 
     } 
     else if(src == tr) { 

     } 
     else if(src == rf) { 

     } 
    } 

    private final JButton tr = new JButton("TRACKER APPLET"); 
    private final JButton rf = new JButton("REFRESH"); 
    private final JButton t1 = new JButton(" "); 
    private final JButton t2 = new JButton(" "); 
    private final JButton t3 = new JButton(" "); 
    private final JButton t4 = new JButton(" "); 
    boolean tc1 = false, tc2 = false, tc3 = false, tc4 = false; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(""); 
     frame.add(new Tracker()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

Я даже пробовал это, на самом деле так. Но есть некоторые ошибки, такие как неопределенный символ (t1, t2, t3, t4). – ram

+0

У меня есть еще один вопрос: правильно ли использовать общее событие с событиями для 4 Jbuttons (t1 ...) и отдельных событий, связанных с событиями для rf и tf JButtons ??? спасибо – ram

+0

* Правильно ли использовать общее событие с событиями для 4 Jbuttons (t1 ...) и отдельных событий, связанных с событиями для rf и tf JButtons ??? *, если есть общая функциональность, то есть no 'if (ae.getSource == button) ', чем это всегда рекомендуется, поскольку он удаляет дублирующий код. Мне никогда не нравится 'if (ae.getSource() == button)', поскольку это поощряет * тугое соединение * между 'ActionListener' и его кнопками (-ами). Скорее добавьте отдельное действие, чем. Кроме того, я бы не рекомендовал * реализовать * компонент ActionListener на компоненте, если только этот компонент не использует общие функции или его классы. –

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