2017-05-27 4 views
0

Je sais que c'est mal rédigé, mais je ne sais pas comment le dire mieux. Essentiellement j'ai mon propre JComponent MyComponent et il peint quelques trucs sur ses graphiques. Je veux peindre son truc, puis appeler une méthode pour terminer la peinture, voici un exemple:Comment puis-je laisser une classe ajouter à ma fonction de peinture?

public class MyComponent extends JComponent{ 
    // etc 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g2 = (Graphics2D)g; 
     g2.drawSomething(); // etc 

     // Once it is done, check if that function is exists, and call it. 
     if(secondaryPaint != null){ 
      secondaryPaint(g2); 
     } 
    } 
} 

Puis, dans une autre classe:

// etc 
MyComponent mc = new MyComponent() 
mc.setSecondaryDrawFunction(paint); 

// etc 

private void paint(Graphics2D g2){ 
    g2.drawSomething(); 
}  

Je ne sais pas comment lambdas travailler ou si elles sont applicables dans cette situation, mais peut-être que cela?

+0

Voulez-vous dire des classes abstraites? Vous pourriez faire une classe abstraite qui hérite de JComponent et remplacer la méthode paintComponent dans laquelle vous peignez et comme dernier appel vous pouvez appeler votre méthode abstraite définie par votre classe abstraite – Pali

Répondre

1

Pas lambdas, mais l'interface de fonction fonctionnera

Vous pouvez faire:

public class MyComponent extends JComponent{ 
    // etc 
    Function<Graphics2D, Void> secondaryPaint; 
    public MyComponent(Function<Graphics2D, Void> myfc){ 
     secondaryPaint = myfc; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D)g; 
     //g2.drawSomething(); // etc 

     // Once it is done, check if that function is exists, and call it. 
     if(secondaryPaint != null){ 
      secondaryPaint.apply(g2); 
     } 
    } 

    static class Something { 
     public static Void compute(Graphics2D g){ 
      return null; 
     } 

     public Void computeNotStatic(Graphics2D g){ 
      return null; 
     } 
    } 

    public static void main(String[] args) { 
     Something smth = new Something(); 
     new MyComponent(Something::compute); // with static 
     new MyComponent(smth::computeNotStatic); // with non-static 
    } 
} 
+0

Est-il possible de lui donner une fonction qui n'est pas statique? – doominabox1

+1

Oui bien sûr, je vais éditer dans 2 minutes pour vous montrer comment –