2016-12-02 6 views
0

OK, ich werde versuchen, dies so gut wie möglich zu erklären. Ich bin ziemlich Java-tüchtig, kann aber nach langer Suche keine logische Lösung finden. Nehmen wir an, ich habe eine JPanel-Klasse in Paket A, die ein Diagramm enthalten wird, das gezeichnet wird.Repainting ein JPanel von einem JCheckBox ActionListener in einem anderen Paket

package A 

public class DrawGraph extends JPanel 
{ 
    public DrawGraph() 
    { 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     // other stuff 
    } 

    public void updateGraph() 
    { 
     repaint(); 
    } 
} 

In einer anderen Klasse innerhalb Paket B habe ich eine JCheckBox, dass, wenn diese Klasse die DrawGraph Klasse nicht initialisiert ein Neuzeichnen des Graphen in Paket A. auslösen ausgewählt soll. Diese Klasse wird an anderer Stelle initialisiert.

package B 

public class CheckBoxClass extends JPanel 

public CheckBoxClass 
{ 
    graphicsCheckBox.addActionListener(new ActionListener() 
    { 
     @Override 
     public void actionPerformed(ActionEvent cb) 
     { 
      GUI_Data.graphics = true; 
      DrawGraph.updateGraph(); // Calls Update Graph function 
     } 
    }); 
} 

Nun, wie kann ich die updateGraph Funktion in meiner DrawGraph Klasse aufrufen, ohne eine neue Instanz der Klasse DrawGraph erstellen zu müssen? Ich weiß, dass ich die updateGraph-Methode nicht statisch machen kann, da repaint() nicht statisch ist. Ich habe das Gefühl, dass es einen Weg geben muss, dies zu tun, ohne über einen Timer oder eine andere verschlungene und ineffiziente Methode neu zu streichen. Betrachte ich dieses Problem falsch? Im Grunde brauche ich einen Weg, um ein Repaint der DrawGraph-Klasse von der JCheckBox-Klasse actionlistener auszulösen. Wenn diese Frage nicht klar ist, lassen Sie es mich bitte wissen, damit ich sie überarbeiten kann. Vielen Dank im Voraus, dies ist meine erste Frage, aber ich benutze euch seit einigen Jahren.

Antwort

0

Es scheint ein bisschen Verwirrung der Konzepte hier, lass mich versuchen zu erklären.

statische vs. Instanzmethoden: Eine Klasse kann statische und nicht statische Methoden haben. Nicht statische Methoden können nur für eine Instanz der Klasse aufgerufen werden. statisch kann nur für die Klasse aufgerufen werden (obwohl Sie sie über eine Variable aufrufen können, die eine Instanz der Klasse enthält).

Methodensichtbarkeit: Eine Methode kann privat, geschützt, paketgeschützt oder öffentlich sein. Private Methoden können nur innerhalb derselben Klasse aufgerufen werden). protected kann nur innerhalb der Klasse oder der Unterklassen aufgerufen werden. Paketgeschützt (ohne Qualifier) ​​kann von Klassen innerhalb desselben Pakets aufgerufen werden. Die Öffentlichkeit kann von überall her angerufen werden.

In Ihrem Fall hat die Tatsache, dass die CheckBoxClass nicht im selben Paket ist, nichts damit zu tun, dass Sie DrawGraph.updateGraph() nicht anrufen können. updateGraph() ist eine Instanzmethode (nicht statisch), daher müssen Sie eine Instanz haben, um sie aufzurufen. Wenn Sie nun wissen, dass es in Ihrem Programm nur eine Instanz von DrawGraph geben soll, können Sie das Singleton-Muster verwenden: 1) In der DrawGraph Klasse muss eine statische Variable mit einer Instanz der Klasse selbst initialisiert werden. haben auch eine statische Methode, die eine solche Instanz zurückgibt:

public class DrawGraph { 
    private static DrawGraph singleton = new DrawGraph(); 

    public static getInstance() { 
    return singleton; 
    } 
} 

Jetzt können Sie die folgenden Aktionen aus CheckBoxClass:

@Override 
    public void actionPerformed(ActionEvent cb) 
    { 
     GUI_Data.graphics = true; 
     DrawGraph.getInstance().updateGraph(); // Calls Update Graph function 
    } 
+0

Vielen Dank, so albern, dass ich nicht einmal mit dem Singleton dachte Muster. Ich musste deine Antwort ein wenig für meine Implementierung ändern, aber immer noch das gleiche Prinzip. Danke noch einmal. –

Verwandte Themen