problem z EventHandler.create

0

próbuję utworzyć słuchacza zwierającego jedno wywołanie metody przy użyciu klasy EventHandler i niestety ciągle mi jakieś błędy wyskakują:( czy mógłby mi ktoś powiedzieć jak poprawić ten kod?

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.EventHandler;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Klasa extends JFrame{
    
    public Klasa(){
        setSize(200,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        
        Panel panel=new Panel();
        add(panel);
    }    
    
    public static void main(String[] args){
        new Klasa();
    }
}

class Panel extends JPanel{
    public Panel(){
        
        JButton przycisk=new JButton("wciśnij");
        add(przycisk);
        
        przycisk.addActionListener(EventHandler.create(ActionListener.class, this, "akcja")); //jak to poprawić?
    }
    
    public void akcja(){
        System.out.println("przycisk został przyciśnięty");
    }
}
 

widzę, że jest tu problem ze słowem this, które pewnie trzeba wymienić na coś innego, ale ciągle mi się coś sypie.
za wszelką pomoc będę bardzo wdzięczny.

Pozdrawiam
Tomek

0

najlepiej to zamiast metody, stworzyć klasę obsługującą to zdarzenie. Ja bym to widział tak :

 
public class Main extends JFrame{

    public Main(){
        setSize(200,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        JPanel panel=new Panel();
        add(panel);
    }

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

class Panel extends JPanel{
    public Panel(){

        JButton przycisk=new JButton("wciśnij");
        add(przycisk);

        przycisk.addActionListener(new Action()); //jak to poprawić?
    }

    class Action implements ActionListener {

        public void actionPerformed(ActionEvent e) {
           System.out.println("przycisk został przyciśnięty");
        }
    }  
}
0
remigio napisał(a)

najlepiej to zamiast metody, stworzyć klasę obsługującą to zdarzenie. Ja bym to widział tak : ...

dziękuję za odpowiedź, ale metoda create z klasy EventHandler pozwala uniknąć tworzenia klas wewnętrznych... jest o tym w książce CoreJava. Czytam CoreJava i to co w necie, ale nie wychodzi:(... chciałbym się dowiedzieć jak stosuje się tą metodę.

A przy okazji, jeśli mamy klasę Klasa a w niej metody

class Klasa{
class Action implements ActionListener {

    public void actionPerformed(ActionEvent e) {
       ...
    }
}  
public void metoda(){
    ...
}

}

to jak z klasy Action wywołać metodę metoda() ???

0

Dodaj do klasy Klasa pole mojaKlasa typu Klasa, w konstruktorze zrób przypisanie

 mojaKlasa=this;

a potem

 mojaKlasa.metoda(); 
0

A jeśli chodzi o pierwszy problem to klasa Panel musi być public. Rozbij kod źródłowy na dwa pliki.

0

Dziwne to zachowanie. Nie powinno rzucać wyjątku.

Jeśli zaś chodzi o wywołanie metody metoda to wystarczy użyć wywołania "metoda()". Jeśli natomiast zachodzi przysłanianie nazw to trzeba użyć czegoś takiego:

class Klasa {

    class Action implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            Klasa.this.metoda();
        }
        
        public void metoda() {
        }
    }

    public void metoda() {
    }
}
0

lub możesz się "przenieść" do klasy głównej :

class SetText extends JButton {

    public SetText() {
        super("button");
    }

    public void go(Object goal, String setAction) {
        addActionListener(EventHandler.create(ActionListener.class, goal, setAction));
    }
}
public class Main extends JFrame {

    Main() {
        super("Test");

        SetText bb = new SetText();
        bb.go(this, "setTxt");
        add(bb);
        setSize(200, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void setTxt() {
        System.out.println("txt");
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Main();
            }
        });
    }
}
 

ale faktycznie chyba lepszym rozwiązaniem będzie to co napisał bo.

0
bo napisał(a)

A jeśli chodzi o pierwszy problem to klasa Panel musi być public. Rozbij kod źródłowy na dwa pliki.

Dziękuję, działa jak należy:)
Pozdrawiam
Tomek

0
Wibowit napisał(a)

Jeśli zaś chodzi o wywołanie metody metoda to wystarczy użyć wywołania "metoda()"

no tak, oczywiście... żle napisałem chodzilo mi o coś w stylu this.metoda(); zamienić czymś słowo "this" w poleceniu EventHandler.create(ActionListener, this, "metoda"); nie można wywalić this i zostawić pustego pola.

Dziękuję za wszystkie odpowidzi i serdecznie pozdrawiam
Tomek

1 użytkowników online, w tym zalogowanych: 0, gości: 1