problem z EventHandler.create

Odpowiedz Nowy wątek
2011-07-20 12:00
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

Pozostało 580 znaków

2011-07-20 12:27
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");
        }
    }  
}

Pozostało 580 znaków

2011-07-20 12:32
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() ???

edytowany 1x, ostatnio: Tompey, 2011-07-20 12:47

Pozostało 580 znaków

2011-07-20 12:59
bo
0

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

 mojaKlasa=this;

a potem

 mojaKlasa.metoda(); 

Pozostało 580 znaków

2011-07-20 13:14
bo
0

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

Pozostało 580 znaków

2011-07-20 13:17
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() {
    }
}

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
Przecież napisałem co trzeba zmienić, klasa Panel musi być public. - bogdans 2011-07-20 13:26
Dobra, dobra. Nie widziałem twojego postu, gdy pisałem swojego, a nie chciało mi się edytować. - Wibowit 2011-07-20 13:31

Pozostało 580 znaków

2011-07-20 13:20
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.

edytowany 1x, ostatnio: remigio, 2011-07-20 13:28

Pozostało 580 znaków

2011-07-20 14:27
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

Pozostało 580 znaków

2011-07-20 14:40
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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