2013-11-08 5 views
1

У меня возникли некоторые настройки вверх по ActionListener на JButton неприятности, вот код ...Java ActionListener ошибка: несовместимые типы

package pipes; 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class PipesUI extends javax.swing.JFrame { 

    Main main = new Main(); 

    JButton addPipeButton = new JButton("Add Pipe"); 

    public PipesUI(){ 
     addUI(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    private void addUI(){ 
     addPipeButton.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e){ 
     if (e.getSource()==addPipeButton) 
      main.addPipe(); 
     else 
      ; 
    } 

    public static void main(String args[]) { 
     PipesUI pipesUI = new PipesUI(); // create an instance of the menu 
     pipesUI.setSize(500,500); 
     pipesUI.setVisible(true); 
    } 
} 

Ошибка на линии addPipeButton.addActionListener (это) ;

The (это) она, кажется, не нравится, ошибка говорит: «несовместимые типы: PipesUI не могут быть преобразованы в ActionListener»

Любая помощь будет здорово, спасибо.

+0

Что такое 'this'? Какой тип эта ссылка? –

+0

@SotiriosDelimanolis Я действительно не знаю ...Это мой первый раз, когда я использовал actionlisteners, и я видел «это», записанное в этих скобках, прежде чем я просто использовал их, что должно быть в скобках? – benharris

+0

На моем JFrame ничего не появляется, что вызывает это? – benharris

ответ

6

Вы создали свой метод actionPerformed, но вы не объявили свой класс как ActionListener. Реализация этого интерфейса:

public class PipesUI extends javax.swing.JFrame implements ActionListener { 
+0

Спасибо, это решило ошибку, но моя кнопка все еще не отображается на JFrame, почему это? – benharris

+0

Я не вижу, где вы добавили 'JButton' в свой' JFrame'. [Добавить.] (Http://forum.codecall.net/topic/41873-basic-jframe-with-a-basic-jbutton/) – rgettman

+0

Это очень полезно! Еще раз спасибо! – benharris

2

Я предполагаю, что вы видели addActionListener(this) в другом месте и решили использовать его здесь. Это другое место было совершенно другим контекстом, так как this был экземпляром ActionListner.

Do следующим образом:

addPipeButton.addActionListener(new ActionListner(){ 
    public void actionPerformed(ActionEvent e){ 
     //handle `e` 
    } 
}); 

Edit: У вас уже есть ActionListener методы в вашем классе. В это случае, вы можете использовать:

public class PipesUI extends javax.swing.JFrame implements ActionListener { 
2

Одно из возможных решений:

public class PipesUI extends javax.swing.JFrame implements ActionListener{ 
//implement the relevant methods 

Другое:

private void addUI(){ 
    addPipeButton.addActionListener(new ActionListener(){ 
     //anonymous actionlistener implementation 
    }; 
} 

и так далее и так далее.

3
addPipeButton.addActionListener(this); 

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

Реализовать ActionListener следующим образом:

public class PipesUI extends javax.swing.JFrame implements ActionListener 
{ 
//your code 


    @Override 
    public void actionPerformed(ActionEvent e) { 
    // your code 
    } 

} 

Но из вашего кода я не вижу, как вы добавили addPipeButton в любой контейнер. Просто добавьте кнопку к раме с помощью PipesUIadd(addPipeButton), как показано ниже:

private void addUI(){ 
    add(addPipeButton); <--- adding pipe button 
    addPipeButton.addActionListener(this); 
} 

Этот Jframe.add(addPipeButton) добавит кнопку addPipeButton на панели содержимого фрейма, который имеет BorderLayout как менеджер компоновки по умолчанию.

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