Methode übergeben

Status
Nicht offen für weitere Antworten.

Kerberus

Bekanntes Mitglied
Ist es möglich eine Methode zu übergeben?
Habe eine Klasse geschrieben, die einen ActionListener beinhaltet. Nun sollt ich nach dem erstellen eines Objektes dieser Klasse festlegen können, was gemacht werden soll, wenn der Button xy gedrückt wird.
Habe mir vorgestellt, dass ich eine Methode implementiere mit welcher man eine Methode übergeben kann. Allerdings weiss ich nicht, ob dies möglich ist und wenn ja, wie.
 

Isaac

Bekanntes Mitglied
Ich versteh kein Wort 8)

Wenn du eine Klasse hast die einen ActionListener enthällt und du dann per new ein Objekt dieser klasse erzeugt weiss das Objekt doch wie es reagieren soll. Dafür ist der Listener ja im Objekt.
 

Kerberus

Bekanntes Mitglied
Ich versuch es noch einmal: :D

Also ich habe zwei Klassen geschrieben und die im Package vu.ch.sirmackerberus.Card abgelegt. Card enthält die Klassen
1) CardManager
2) Card

Der CardManager verwaltet die einzelnen Karten. Auf dem Bild siehst du die erste Karte eines Dialoges.
CardManager.jpg

Wenn ich nun auf NEXT drücke, dann wird beim CardManager die nächste Card angefordert und geladen.

Beispielscode:
Code:
import vu.ch.sirmackerberus.Card.*;

...

CardManager manager = new CardManager();

Card eins = new Card("EINS", manager); //neue Karte erstellen
manager.add(eins); //Karte beim Manager anmelden

.... //weitere Karten erstellen und adden

//Die Karten können mit beliebigem Inhalt gefüllt werden.

manager.load();

Von nun an verwaltet der CardManager und ich muss mich um nichts mehr kümmern.

So. Nun drücke ich solange auf NEXT bis ich bei der letzten Karte angekommen bin. Dann ermöglicht mir der CardManager auch die Option OK. Nun möchte ich, dass eine Methode aufgerufen wird, wenn auf OK gedrückt wird, allerdings sollte diese vom Programmierer selbst festgelegt werden können.
Die Methoden NEXT, PREVIOUS kann ich ja vordefinieren, weil sie immer gleich bleiben. OK allerdings ist von Anwendung zu Anwendug verschieden.

Das ganze sollte in etwa so funktionieren:
Code:
public void test()
{
 System.out.println("test");
}

....


manager.setOKMethod(test());

//wenn nun auf OK gedrückt wird, sollte test() aufgerufen werden.

Ist nun alles klar? ;-)
 
B

Beni

Gast
Da machst du am einfachsten ein kleines Interface:

Code:
public interface OkListener{
  /**
    * Wird aufgerufen, sollte jemand auf den "OK"-Button drücken.
    * @return true, wenn der Dialog geschlossen werden soll, false wenn der Dialog offen bleiben soll.
    */
  public boolean okPressed();
}

Dann kannst du den CardManager etwa so implementieren:
Code:
public class CardManager extends [...]{
  private OkListener listener;

  public CardManager(){
    [...]
    JButton okButton = ...
    okButton.addActionListener( new ActionListener(){
      public void actionPerformed( ActionEvent e ){
        if( listener != null ){
          boolean ok = listener.okPressed();
          if( ok ){
             // [ ... Dialog schliessen ... ]
          }
        }
      }
    });
  }

  public void setOkListener( OkListener listener ){
    this.listener = listener;
  }
}

Und dann kann man das Interface überall implementieren, wo man es halt gerade so braucht.

Code:
public class Test implements OkListener{
  public void doSomething(){
    CardManager card = new ...
    card.setOkListener( this );
    [ ... und so weiter ... ]
  }
 
  public boolean okPressed(){
    return [... Eingabe ist gut... ]
  }
}
 

Isaac

Bekanntes Mitglied
Das hört sich nach Komponenten Entwicklung an.

Mach die Klasse CardManager abstract. Der Anwender - der Programmierer - muss dann von Cardmanager ableiten und die Methode manager.setOK() selber implementieren.
 

Kerberus

Bekanntes Mitglied
Hm. Irgend etwas geht immer nocht nicht. Schaut euch mal die Methode showCard() an.

Wie kann ich das JPanel CardWindow löschen, d.h. die Card welche vorher drin war, überschreiben?
Code:
package vu.ch.sirmackerberus.card;

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

import vu.ch.sirmackerberus.card.*;

/**
 * Ermoeglicht das Verwalten verschiedenenr Cards.
 * 
 * @author Sir MacKerberus
 * @version 11.07.2004
 */

public abstract class CardManager extends JFrame implements ActionListener
{
    public Vector interneVerwaltung = new Vector(); //interne Verwaltung der Cards
    
    private JButton previous; //Die drei Buttons zur Steuerung des Stapels
    private JButton next;
    private JButton ok;
    
    private JPanel CardWindow; //JPanel, das mit der jeweiligen Card gefüllt wird
    
    private JPanel control; //Repräsentiert die drei Buttons zur Steuerung des Stapels
    
    private int index = 0; //Beschreibt die Position der aktuellen Card im Stapel
    
    private int card_size_x; //Enthält die Breite einer Karte
    private int card_size_y; //Enthält die Höhe einer Karkte
    
    /**
     * Constructor for objects of class CardManager
     */
    
    public CardManager(String title, int card_size_x, int card_size_y)
    {
        super(title);
        this.getContentPane().setLayout(null);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        this.setSize(card_size_x + 20, card_size_y + 100);
        
        CardWindow = new JPanel();
        CardWindow.setSize(card_size_x, card_size_y);
        CardWindow.setLayout(null);
        
        control = new JPanel();
        control.setBorder(new TitledBorder("Control"));
        control.setLayout(null);
        
        previous = new JButton("Previous");
        previous.addActionListener(this);
        previous.setBounds(20, 20, 100, 20);
        control.add(previous);
        
        next = new JButton("Next");
        next.addActionListener(this);
        next.setBounds((card_size_x / 2) - 50, 20, 100, 20);
        control.add(next);
        
        ok = new JButton("Ok");
        ok.addActionListener(this);
        ok.setBounds(card_size_x - 120, 20, 100, 20);
        control.add(ok);
        
        CardWindow.setBounds(10, 10, card_size_x, card_size_y);
        this.getContentPane().add(CardWindow);
        
        control.setBounds(10, card_size_y + 20, card_size_x, 50);
        this.getContentPane().add(control);
        
        this.card_size_x = card_size_x;
        this.card_size_y = card_size_y;
        
        this.setVisible(true);
    }

    public void actionPerformed(ActionEvent e)
    {
        Object source = e.getSource();
        
        if(source == previous)
        {
            previousCard();
        }
        
        if(source == next)
        {
            nextCard();
        }
        
        if(source == ok)
        {
            CardManagerEvent();
        }       
    }
    
    public void addCard(Card param_card)
    {
        interneVerwaltung.add(param_card);
    }
    
    private void showCard(int pointer)
    {
        Card card_pointer = (Card) interneVerwaltung.get(pointer);
        
        previous.setEnabled(true);
        next.setEnabled(true);
        ok.setEnabled(true);
        
        if(card_pointer == (Card) interneVerwaltung.firstElement())
        {
            previous.setEnabled(false);
        }
        
        if(card_pointer == (Card)interneVerwaltung.lastElement())
        {
            next.setEnabled(false);
        }
        
        if(card_pointer != (Card) interneVerwaltung.lastElement())
        {
            ok.setEnabled(false);
        }
        
        card_pointer.setBounds(0, 0, card_size_x, card_size_y);
        CardWindow.add(card_pointer);
        
        this.CardWindow.repaint();
    }
    
    public void load()
    {
        showCard(index);
    }
    
    private void previousCard()
    {
        index = index - 1;
        this.load();
    }
    
    private void nextCard()
    {
        index = index + 1;
        this.load();
    }
  
    public abstract void CardManagerEvent();
}
 
B

Beni

Gast
Einfach alles entfernen, was auf dem Panel ist:
Code:
CardWindow.removeAll();
CardWindow.add(card_pointer);

P.S. schreib doch Variablennamen klein, dann wird es leserlicher 8)
 

Kerberus

Bekanntes Mitglied
Werd ich mir merken. Aber spielt ja keine Rolle. Der Programmierer hat ja nichts mit den Variablennamen zu tun. Er muss ja nur von CardManager ableiten und Cards hinzufügen.

Nun funktioniert die von mir entwickelte Komponente perfekt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Methode übergeben AWT, Swing, JavaFX & SWT 16
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
M passende Reflexion-Methode?? AWT, Swing, JavaFX & SWT 1
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
M Swing Methode datenLesen() greift auf catchBlock zu? AWT, Swing, JavaFX & SWT 25
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
Z Methode bei Boolean change neu Ausführen AWT, Swing, JavaFX & SWT 9
T TableView über Methode befüllen AWT, Swing, JavaFX & SWT 10
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
L JFrame Gui in anderer Methode aufrufen AWT, Swing, JavaFX & SWT 0
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
A Methode pausieren bis anderes Ereignis ausgeführt AWT, Swing, JavaFX & SWT 2
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Brauche Erklärung von Methode AWT, Swing, JavaFX & SWT 1
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
I Methode Draw3DRect und DrawRect AWT, Swing, JavaFX & SWT 2
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
K Methode repaint() AWT, Swing, JavaFX & SWT 1
A Methode in bestimmten Intervall ausführen AWT, Swing, JavaFX & SWT 2
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7
Q AWT Methodenaufruf aus actionPerformed-Methode AWT, Swing, JavaFX & SWT 4
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
T Swing Methode in Listener aufrufen AWT, Swing, JavaFX & SWT 3
P keyTyped-Methode AWT, Swing, JavaFX & SWT 1
D JavaFX Java Methoden mit JavaFX Methode kommunizieren lassen? AWT, Swing, JavaFX & SWT 3
M JavaFX Methode nach initialize() aufrufen AWT, Swing, JavaFX & SWT 6
F JavaFX Mit einer Methode auf Stage zugreifen. AWT, Swing, JavaFX & SWT 8
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
C JavaFX Auf Nodes einer FXML-Datei in start Methode zugreifen AWT, Swing, JavaFX & SWT 5
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
K Swing Durch Methode erzeugte Buttons ansteuern AWT, Swing, JavaFX & SWT 5
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
T LayoutManager Methode, um Bildschirm(fenster) für Aktualisierungen zu blockieren bzw. freizugeben gesucht AWT, Swing, JavaFX & SWT 2
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
S PaintIn - Methode AWT, Swing, JavaFX & SWT 1
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A befüllen eines JTables mittels Methode AWT, Swing, JavaFX & SWT 10
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
D JavaFX Interface Initializable - Was machen die Parameter in der Methode inizializeable() ? AWT, Swing, JavaFX & SWT 4
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
F JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Was ruft die Paint - Methode auf ? AWT, Swing, JavaFX & SWT 2
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
S Farbe ändern bei der paint-Methode AWT, Swing, JavaFX & SWT 5
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
J Problem mit der paint Methode AWT, Swing, JavaFX & SWT 0
J JLabel während einer methode aktualisieren AWT, Swing, JavaFX & SWT 6
Junb 2D-Grafik paint() Methode bugt? AWT, Swing, JavaFX & SWT 2
T Swing Label aus anderer Methode bearbeiten AWT, Swing, JavaFX & SWT 2
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
C Methode über Buttonklick starten AWT, Swing, JavaFX & SWT 8
S Swing Mit einem Link eine Methode aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Auf Methode zugreifen (am Schlauch steh) AWT, Swing, JavaFX & SWT 5
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
D Swing DefaultTableModel setValueAt Methode AWT, Swing, JavaFX & SWT 7
J valueChanged()-Methode liefert unbrauchbare Daten AWT, Swing, JavaFX & SWT 4
T Swing JPanel - "Open" Methode? AWT, Swing, JavaFX & SWT 6
P Swing actionPerformed()-Methode funktioniert nicht AWT, Swing, JavaFX & SWT 3
M Applet Bricht Methode zwischendruch ab AWT, Swing, JavaFX & SWT 11
K Per Textfield Methode ausführen AWT, Swing, JavaFX & SWT 6
J Swing JTable - nach Sortieren andere Methode aufrufen AWT, Swing, JavaFX & SWT 2
C Swing Was macht die Methode "setDataProviderCreditShown(boolean b)" AWT, Swing, JavaFX & SWT 4
R Swing Mit Swing eine throws Exception Methode öffnen AWT, Swing, JavaFX & SWT 3
GianaSisters Swing jTable's valueChanged Methode überschreiben AWT, Swing, JavaFX & SWT 2
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
N Methode zum Prüfen ob Jtextfield verändert worden ist AWT, Swing, JavaFX & SWT 2
K beim Schließen des JFrames, Methode aufrufen AWT, Swing, JavaFX & SWT 3
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
E Umgang mit der Update Methode AWT, Swing, JavaFX & SWT 38
D Applet Methode in Timer einbinden AWT, Swing, JavaFX & SWT 6
Screen Fehler bei Get-Methode für ArrayList AWT, Swing, JavaFX & SWT 8
P Swing JPanel über Methode setzen AWT, Swing, JavaFX & SWT 2
A Frage zur Methode matches() AWT, Swing, JavaFX & SWT 2
eskimo328 Java6 Methode in Java5 verwenden (memory leak JInternalFrame) AWT, Swing, JavaFX & SWT 4
T Swing setText()-Methode Funktioniert nicht AWT, Swing, JavaFX & SWT 7
L JLabel Methode setText funktioniert nicht AWT, Swing, JavaFX & SWT 5
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
S Visual Editor mit main Methode AWT, Swing, JavaFX & SWT 3
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
F Swing JFrame Methode beim Schließen aufrufen AWT, Swing, JavaFX & SWT 5
D Zwei String Attribute über eine Methode als Zeilen in einer Tabelle darstellen AWT, Swing, JavaFX & SWT 9
H applet Methode aus abstrakter Klasse aufrufen AWT, Swing, JavaFX & SWT 12
S Methode fireTableDataChanged() AWT, Swing, JavaFX & SWT 2
Y Swing Problem mit Main Methode AWT, Swing, JavaFX & SWT 8
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5
R Run Methode Probleme AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben