2013-06-20 4 views
0

Я пытаюсь узнать больше о actionListeners.Java Понимание getSource() & прослушивателя действий

Я пытаюсь распечатать сообщение «Test Action», если нажать кнопку «Сохранить». В любом случае, я не понимаю.

Вот мой код, надеюсь, что кто-нибудь может мне помочь. Заранее спасибо.

import java.awt.Color; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.event.*; 
import javax.swing.JApplet; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingConstants; 

public class applet extends JApplet implements ActionListener { 

    private static final long serialVersionUID = -5561312464056465383L; 
    private JTextField txtNameEingeben; 
    private JTextField txtPwEingeben; 

    public applet() { 
     getContentPane().setLayout(new GridLayout(1, 0, 0, 0)); 
     JPanel panel = new JPanel(); 
     panel.setBackground(Color.DARK_GRAY); 
     getContentPane().add(panel); 
     panel.setLayout(null); 
     JLabel lblANewLabel = new JLabel("Name"); 
     lblANewLabel.setHorizontalAlignment(SwingConstants.LEFT); 
     lblANewLabel.setFont(new Font("Lucida Grande", Font.PLAIN, 20)); 
     lblANewLabel.setBounds(33, 57, 117, 37); 
     lblANewLabel.setForeground(Color.WHITE); 
     panel.add(lblANewLabel); 
     //TEXTFELD NAME 
     txtNameEingeben = new JTextField(); 
     txtNameEingeben.setText(""); 
     txtNameEingeben.setBounds(162, 64, 134, 28); 
     panel.add(txtNameEingeben); 
     txtNameEingeben.setColumns(10); 
     //TEXTFELD PASSWORT 
     txtPwEingeben = new JTextField(); 
     txtPwEingeben.setText(""); 
     txtPwEingeben.setBounds(162, 113, 134, 28); 
     panel.add(txtPwEingeben); 
     txtPwEingeben.setColumns(10); 
     //LABEL ÜBERSCHRIFT 
     JLabel lblNamePasswort = new JLabel("Name & Passwort in einem Array  speichern"); 
     lblNamePasswort.setForeground(Color.WHITE); 
     lblNamePasswort.setHorizontalAlignment(SwingConstants.CENTER); 
     lblNamePasswort.setBounds(0, 23, 450, 16); 
     panel.add(lblNamePasswort); 
     JButton btnSave = new JButton("save"); 
     btnSave.setBounds(308, 251, 117, 29); 
     panel.add(btnSave); 
     btnSave.addActionListener(new events());  
    } 

    public void save(ActionEvent event) { 
     System.out.println("Button gedrückt."); 
    } 

    public void actionPerformed(ActionEvent event) { 
     if (event.getSource(btnSave)) { 
      System.out.println("Test Action"); 
     } 
    } 

    public static void main(String[] args) { 
     applet applet1 = new applet(); 
     applet1.setVisible(true); 
    } 
} 
+2

"Во всяком случае, я не понимаю вообще." Пожалуйста, сделайте лучшее описание проблемы. –

+2

не должен 'if (event.getSource (btnSave)) {' be 'if (event.getSource() == btnSave) {' – jlordo

+1

btnSave.addActionListener (новые события()); , Что такое события ?. Это должно быть btnSave.addActionListener (это); – Chuidiang

ответ

4
  1. не использовать, чтобы зарезервированные имена классов и методов Java как имя вашего проекта.public class applet extends... должен быть public class MyApplet extends....,

  2. использование собственно Java Naming Convention

  3. использование JFrame вместо JApplet, создать JFrame, как локальная переменная вместо расширяет JFrame, similair за private JTextField txtNameEingeben;

  4. использования LayoutManager вместо AbsoluteLayout (setBounds(...))

  5. от btnSave.addActionListener(new events());events() не объявлен

  6. вы должны использовать event.getSource() == btnSave вместо event.getSource(btnSave)

  7. читать учебник Oracle о How to Write an Action Listener

+1

6, я предпочитаю использовать анонимный класс, если этот actionListener предназначен только для этой кнопки – nachokk

+0

@nachokk yes right или Swing Action, но в этой форме (анонимный класс или Swing Action) будет просто пустая информация для OP – mKorbel

+0

+1 для предпочтения композиции над наследованием, но это плохо в компонентах swing, например, если вы используете guiditor как matisse, вы не можете его создать, если вы его не продлеваете. – nachokk

0

Вы могли бы заменить:

// (Where 'events' seems to come from nowhere) 
btnSave.addActionListener(new events()); 

By:

btnSave.addActionListener(
    new ActionListener() { 
     public void actionPerformed(ActionEvent event) 
     { 
      //if (event.getSource() == btnSave) { // Usefull only in case 2. 
       System.out.println("Test Action"); 
      //} 
     } 
});  

Ваш слушатель может быть:

  1. объявлен как выше (анонимно), OR,
  2. , созданный путем создания экземпляра класса, который реализует ActionListener (смотрите here).

Для варианта 2. в ваш класс реализует вложение ActionListener, вы могли пройти его в качестве параметра:

btnSave.addActionListener(this); 


Примечание: Кроме того, вы должны следовать за каждую рекомендацию mKorbel.

+1

ваш check 'event.getSource() == btnSave' является ненужным и, кроме того, событие должно быть e. – nachokk

+0

Да, правда. Но это было бы полезно, если бы один и тот же прослушиватель использовался для нескольких элементов управления (в случае, когда мы решили создать класс, реализует «ActionListener»). Так что все еще полезно для педагогического аспекта ... –

1

ActionEvent # getSource() предоставляет компонент, ответственный за стрельбу. В случае кнопок Swing ставит кнопку в качестве источника. Это означает, что вам нужно проверить, является ли кнопка источником. Есть два способа сделать это в вашем коде:

кнопки
  1. Сделать на поле:

    public class applet extends JApplet implements ActionListener { 
    
        /** 
    * 
    */ 
        private static final long serialVersionUID = -5561312464056465383L; 
        private JTextField txtNameEingeben; 
        private JTextField txtPwEingeben; 
    
        private JButton btnSave; 
    
        /** 
        * Create the applet. 
        */ 
        public applet() { 
    
        ... 
    
        lblNamePasswort.setHorizontalAlignment(SwingConstants.CENTER); 
        lblNamePasswort.setBounds(0, 23, 450, 16); 
        panel.add(lblNamePasswort); 
    
        btnSave = new JButton("save"); 
        btnSave.setBounds(308, 251, 117, 29); 
        panel.add(btnSave); 
        btnSave.addActionListener(this); 
    
        } 
    
        public void actionPerformed(ActionEvent event) { 
        if (btnSave.equals(event.getSource())) { 
         save(); 
        } 
        } 
    
        public void save() { 
        System.out.println("Button gedrückt."); 
        } 
        ... 
    

    }

  2. приятнее способ его реализация, не должны позволить всем апплет для реализации Action listener, но просто используйте встроенные реализации.

     public class applet extends JApplet { 
    
         private static final long serialVersionUID = -5561312464056465383L; 
         private JTextField txtNameEingeben; 
         private JTextField txtPwEingeben; 
    
         /** 
         * Create the applet. 
         */ 
         public applet() { 
          getContentPane().setLayout(new GridLayout(1, 0, 0, 0)); 
    
          // left out 
          ...    
    
          JButton btnSave = new JButton("save"); 
          btnSave.setBounds(308, 251, 117, 29); 
          panel.add(btnSave); 
          btnSave.addActionListener(new ActionListener() { 
    
          @Override 
          public void actionPerformed(ActionEvent e) { 
           save(); 
          } 
          }); 
    
         } 
    
         public void save() { 
          System.out.println("Button gedrückt."); 
         } 
    
         public static void main(String[] args) { 
          applet applet1 = new applet(); 
          applet1.setVisible(true); 
         } 
         }