2015-06-18 3 views
0

В настоящее время я работаю над уроками Java Swing после окончания первого набора уроков на Java. На этом занятии мы работаем над связью между различными компонентами (кнопками, панелями инструментов и т. Д.), Которые мы изучали. Проблема заключается в том, что «this» передается как аргумент метода для метода addActionListener(). Это работает, однако, я не совсем понимаю, что он делает. Я сделал некоторые исследования в отношении «этого» и обнаружил, что наиболее популярное использование для этого «ключевого слова» будет в конструкторах с переменными с одинаковыми именами. Я не мог найти пример, который бы соответствовал моему делу. Посмотрев на приведенный ниже код, я объясню, какие части кода я понимаю.Передача «этого» в качестве аргумента метода - Уточнение

import java.awt.FlowLayout; Implements FlowLayout class 
import java.awt.event.ActionEvent; //Imports ActionEvent Class 
import java.awt.event.ActionListener; //Imports ActionListener Interface 
import javax.swing.JButton; //Imports JButton class 
import javax.swing.JPanel; //Imports JPanel class 


public class Toolbar extends JPanel implements ActionListener { 
    //^Inherits JPanel & Implements ActionListener Interface 

    private JButton helloButton; //Creating variable of JButton type 
    private JButton goodbyeButton; //Creating variable of JButton type 


    public Toolbar() { //Constructor 

     helloButton = new JButton("Hello"); //Creates new JButton 
     goodbyeButton = new JButton("Goodbye"); //Creates new JButton 

     helloButton.addActionListener(this); //Question 1 
     goodbyeButton.addActionListener(this); //Question 1 

     setLayout(new FlowLayout(FlowLayout.LEFT)); //Sets Layout Type to Left 


     add(helloButton); //Adds button to FlowLayout (Layout Manager) Interface 
     add(goodbyeButton); //Adds button to FlowLayout (Layout Manager) Interface 

    } 

    public void setTextPanel(TextPanel textPanel) { 
     //No Usage Yet! 
    } 

    public void actionPerformed(ActionEvent arg0) { //Unimplemented Method from ActionListener 
     System.out.println("A button was clicked"); //Prints after button is clicked. 

    } 

} 

Вопрос 1: Как вы можете видеть, после создания двух JButtons, мы добавляем метод addActionListener() для того, чтобы увидеть, обнаружить, если кнопка была нажата. Если он был нажат, то он выполнит любой код, введенный в actionPerformed, который реализуется из интерфейса ActionListener. На предыдущих уроках у нас был другой способ заставить кнопку реагировать на щелчок. Он сделал то же самое, но это выглядело так:

btn.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent arg0) { 

     textPanel.appendText("Hello\n"); 

     } 


    }); 

В этом примере, а не печатать на консоли, чтобы проверить, чтобы увидеть, если ActionListener() работала, мы просто добавляется текст в текстовой области от настраиваемый компонент. В коде непосредственно над этим текстом мы работаем с анонимным классом.

Итак ... Вопрос в том, что именно это происходит, поскольку оно передается как аргумент метода в addActionListener()? Я знаю, что он печатает «кнопку нажата» на консоль, но я не понимаю логики того, что «это» делает, чтобы отправить кнопку нажатой на actionPerformed().

Это то, что приложения выглядит следующим образом:

The application running, and printing to console!

Это приложение, в движении, а кнопки уже напечатаны на консоль после нажатия. Я думал, это может дать вам лучшее представление о том, над чем я работаю. Я надеюсь, что кто-то может пролить свет на это и объяснить, как «это» работает в этом контексте. Спасибо!

ответ

1

это представляет текущий экземпляр вашего класс.

Класс панели инструментов реализует интерфейс ActionListener, это означает, что он обеспечивает реализацию метода actionPerformed.

Значит, helloButton.addActionListener(this); становится возможным (попробуйте удалить инструменты ActionListener из объявления класса, код не будет компилироваться).

Сказав это, экземпляры панели инструментов можно рассматривать как объекты ActionListener и могут быть переданы button.addActionListener.

При использовании

btn.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent event) { 
     } 
} 

создать новую реализацию интерфейса ActionListener в лету. Этот вид реализации называется анонимным.

Оба решения являются действительными. Предпочитайте анонимное решение, если код в actionPerformed не может использоваться из другого места.

+0

Спасибо! Ваш ответ был очень понятен. –

1

Реализуя ActionListener и переходя затем к thisaddActionListener метод вы просите, чтобы быть в курсе каких-либо действий, которые выполняются с помощью вызова вашего метода actionPerformed.

Или, проще говоря, вы указываете кнопку своего номера телефона и просите ее позвонить вам всякий раз, когда что-то происходит.

В предыдущих уроках вы заявляли, что должно произойти - напечатайте этот текст или добавьте текст в текстовую панель. Для этого вы делали ActionListener на лету. Теперь вы реализуете ActionListener самостоятельно, вы можете запросить обратный вызов вы anstead создания слушателя один на лету.

1

Метод addActionListener для компонента swing принимает аргумент типа ActionListener. Класс, который реализует ActionListener, содержит код, который указывает, что должно быть сделано, когда кто-то взаимодействует с компонентом swing.

Когда вы передаете this методу addActionListener, вы передаете ссылку на текущий объект, который создается.Как это происходит, создаваемый текущий объект также является ActionListener (поскольку он реализует ActionListener) и поэтому может быть передан в метод addActionListener.

Когда вы взаимодействуете с JButton в GUI, то actionPerformed метод Toolbar класса будет называться так как это ActionListener, что вы зарегистрировали JButton с.

2

this - всего лишь экземпляр вашего класса Toolbar. Он используется внутри методов экземпляра для представления текущего экземпляра. По существу, вы можете себе представить, что ваш класс имеет другую переменную частного члена с именем this, которая указывает на объект Toolbar.

С Toolbar реализует ActionListener вы назначаете вновь инстанцированный Toolbar объекта в качестве слушателя к кнопкам (что означает метод Toolbar.actionPerformed() будет вызываться при нажатии кнопок.)

1

Эти два примера будут делать то же самое (предполагается, что весь импорт есть, и что капитализация будет правильно):

public static void main(String args[]){ 
    myFrame frame = new myFrame(); 
    myFrame.addActionListener(new myListener); 
} 

public myFrame extends JFrame{ 
    public myFrame(){ 
     super("myFrame"); 
    } 
} 

public myListener implements ActionListener{ 
    public void ActionPerformed(ActionEvent e){ 
     //Do Stuff 
    } 
} 

и

public static void main(String args[]){ 
    myFrame frame = new myFrame();  
} 

public myFrame extends JFrame implements ActionListener{ 
    public myFrame(){ 
     super("myFrame"); 
     this.add(this); 
    } 

    public void ActionPerformed(ActionEvent e){ 
     //Do Stuff 
    } 
} 

Преимущество имея ActionListener быть this заключается в том, что он будет иметь более прямой доступ к полям и методам, если вы хотите сделать модификатор для методов private. Однако, если вы хотите избежать if/else, если монстры для обработки нескольких кнопок, я рекомендую либо использовать отдельный ActionListener (и предоставить средство для изменения того, что нужно изменить), либо взглянуть на анонимные классы и лямбда-выражения.

1

Часто с объектно-ориентированным кодированием стоит играть роль объекта класса, который вы кодируете. Если вы это сделаете, «это» означает «я».

И поскольку Java является передачей по ссылке, «это» является стрелкой, указывающей на «меня».

public class Foo implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      // do something useful with e 
     } 
} 

Здесь мы написали класс Foo. Поскольку мы сказали, что он реализует ActionListener, он должен иметь метод actionPerformed(). Все, что можно назвать это:

ActionListener listener = new Foo(...); 
ActionEvent event = ...; 
foo.actionPerformed(event); 

И мы можем создать Foo и дать ему то, что генерирует событие:

ActionListener listener = new Foo(...); 
button.addListener(listener); 

Если разыграет объект, вы можете думать об этой последней строке, как «Привет button! Сообщите listener всякий раз, когда происходит действие».

Теперь, если мы хотим, чтобы слушатель взял контроль над тем, кто ему говорит, что само по себе? «Привет, button, скажите me всякий раз, когда происходит действие».

public class Foo implements ActionListener { 

     public attachToButton(JButton button) { 
      button.addActionListener(this); 
     } 

     public void actionPerformed(ActionEvent e) { 
      // do something useful with e 
     } 
} 

Это может помочь представить, что addActionListener код этой кнопки может выглядеть следующим образом:

public class JButton { // not the real JButton code, but it will be similar 
    private List<ActionListener> actionListeners = new ArrayList<ActionListener>(); 

    public void addActionListener(ActionListener a) { 
     actionListeners.add(a); 
    } 

    // called internally when an event happens 
    private void onEvent(ActionEvent e) { 
     for(ActionListener listener : actionListeners) { 
      listener.actionPerformed(e); 
     } 
    } 
} 

Так что, если вы слушатель, что названный addActionListener(this), то, что список содержит ссылку, указывающую обратно у вас, которую кнопка использует, чтобы нажимать вас на плечо каждый раз, когда происходит действие.

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