2016-08-09 44 views
1

Ich lerne objektorientierte Programmierung aus einem Buch. Ich bin ziemlich weit gekommen, aber jetzt stecke ich fest. Ist wExec wieder selbst ausgeführt? Ich bin mir nicht sicher, ob das überhaupt möglich ist. Kann das jemand für mich klären? Wenn ich den Knopf "Fertig" drücke und die Ausführung des Referenzobjekts verlasse, bin ich so verwirrt. Hier ist der Code von jeder Klasse:Was passiert mit dem Ereignisobjekt? Wird Code erneut ausgeführt?

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

public class RunApp { 
    public static void main(String[] args) { 
     MainApp app = new MainApp("hello world"); 
     app.showApp(); 
    } 
} 

class MainApp extends MmvcApp { 
    WmvcButton btnDone; 
    WmvcButton btnExit; 

    public MainApp(String title) { 
     super(title); 
     btnDone = new WmvcButton("Done", new WmvcExecutor() { 
      public void execute(ActionEvent event) { 
       System.out.println("done"); 
       System.out.println("test 2"); 
      } 
     }); 

     btnExit = new WmvcButton("Exit", btnDone.getExecutor()); 

    } 
} 

abstract class MmvcApp { 
    private static JFrame frame; 
    private static JPanel panel; 
    private static MmvcApp singletonApp = null; 

    public MmvcApp(String frameText) { 
     singletonApp = this; 
     initializeApp(frameText); 
    } 

    public void initializeApp(String frameText) { 
     frame = new JFrame(frameText); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     panel = new JPanel(); 
     panel.setPreferredSize(new Dimension(400, 300)); 
     frame.add(panel, BorderLayout.CENTER); 
    } 

    public static JFrame getFrame() { 
     return frame; 
    } 

    public static JPanel getPanel() { 
     return panel; 
    } 

    public static MmvcApp getApp() { 
     return singletonApp; 
    } 

    public void showApp() { 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

class WmvcButton extends WmvcController { 
    private JButton myButton; 

    public WmvcButton(String compText, WmvcExecutor wExec) { 
     super((JComponent) new JButton(), wExec); 

     myButton = (JButton) myComponent; 

     myButton.setText(compText); 
     myButton.addActionListener(this); 
     MmvcApp.getPanel().add(myButton); 
    } 
} 

class WmvcController implements ActionListener { 
    public JComponent myComponent; 
    private WmvcExecutor wExec; 

    public WmvcController(JComponent component, WmvcExecutor wExec) { 
     myComponent = component; 
     this.wExec = wExec; 
    } 

    public WmvcExecutor getExecutor() { 
     return wExec; 
    } 

    public void actionPerformed(ActionEvent event) { 
     if (wExec != null) { 
      wExec.execute(event); 
      System.out.println("test 1"); 
     } else 
      System.out.println("not working "); 
    } 
} 

class WmvcExecutor { 
    public void execute(ActionEvent event) { 
    } 
} 
+0

Es tut mir leid - was hast du genau verwechselt? Was ist deine genaue Frage? –

+0

Nebenbei möchten Sie lernen und verwenden [Java Namenskonventionen] (http://en.wikipedia.org/wiki/Naming_convention_ (Programmierung) #Java). Variablennamen sollten alle mit einem niedrigeren Buchstaben beginnen, während Klassennamen mit einem Großbuchstaben beginnen. Wenn wir dies lernen und diesem Beispiel folgen, können wir Ihren Code besser verstehen und den Code anderer besser verstehen. –

+1

'new wmvcExecutor() {...}' definiert eine neue Art von ** Klasse ** (speziell eine [anonyme Klasse] (https://docs.oracle.com/javase/tutorial/java/javaOO/anonymyclasses) .html)). –

Antwort

1

Beide btnDone und btnExit haben denselben Bezug auf WmvncExecuter. In dieser Linie hier:

btnDone = new WmvcButton("Done", new WmvcExecutor() { 
    public void execute(ActionEvent event) { 
     System.out.println("done"); 
     System.out.println("test 2"); 
    } 
}); 
btnExit = new WmvcButton("Exit", btnDone.getExecutor()); 

Sie das Überschreiben der execute() Methode. Es ist das Gleiche wie eine neue Klasse zu erstellen und sie dort zu überschreiben.

class WmvcExecuterTest extends WmvcExecuter{ 
    public void execute(ActionEvent event){ 
     System.out.println("done"); 
    } 
} 

Also, wann immer Sie execute() von einem normalen WmvnExecuter nennen es etwas wird nicht tun, sondern weil Sie execute() außer Kraft setzen. Es wird den neuen Code immer dann ausführen, wenn execute() von dieser bestimmten Instanz aufgerufen wird.

+0

Ich bekomme ein bisschen von dem, was Sie sagen, aber es immer noch schäbig, aber trotzdem danke krank lesen Sie Ihren Beitrag sorgfältig – user2245494

+0

@ user2245494 das wirklich nur tun muss mit [Anonyme Klassen] (https://docs.oracle.com/javase/tutorial/java/javaOO/anonymyclasses.html), wie Elliot Frisch darauf hingewiesen hat. – Arthur