2016-07-26 9 views
0

Ich habe eine benutzerdefinierte JLayeredPane und zwei benutzerdefinierte Kind JPanel 's. Ich streiche alles in einem while Loop in einem Thread. Ich habe RepaintManager.currentManager(backPanel).markCompletelyClean(backPanel); verwendet, um die Neuanstrich der backPanelJPanel zu stoppen. Um keine Systemressourcen zu verschwenden. Dies funktioniert jedoch nicht. Wie Sie in der paintComponent -Methode sehen können, wenn Sie den unten stehenden Code ausführen und kompilieren, sehen Sie, dass die Anweisung "Recursion" in der Ausgabe rekursiv wiederholt wird, aus dem Methodenaufruf System.out.println("Reccursion") in der paintComponent Methode.Warum wird dieses JPanel immer noch neu gezeichnet?

Warum ist die backPanelJPanel noch neu gestrichen werden und warum ist die Methode System.out.println("Reccursion") noch genannt wird, wenn ich RepaintManager.currentManager(backPanel).markCompletelyClean(backPanel); verwendet haben.

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 

public class Main extends JLayeredPane { 
    static JFrame frame; 
    static Main main; 
    static Dimension screenSize; 
    public Main() {  
     JPanel backPanel = new BackPanel(); 
     JPanel frontPanel = new FrontPanel(); 
     add(backPanel, new Integer(7)); 
     add(frontPanel, new Integer(8)); 

     new Thread(() -> { 
      while (true){ 
       repaint(); 
      } 
     }).start(); 

     RepaintManager.currentManager(backPanel).markCompletelyClean(backPanel); 

    } 

    public static void main(String[] args) { 
     screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

     frame = new JFrame("Game"); // Just use the constructor 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     main = new Main(); 
     frame.add(main, BorderLayout.CENTER); 

     frame.pack(); 
     frame.setSize(screenSize); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 



    } 
    public class BackPanel extends JPanel{ 
     public boolean drawn = false; 
     public BackPanel(){ 
      setVisible(true); 
      setOpaque(false); 
      setSize(screenSize); 
      JLabel test1 = new JLabel("Test1"); 
      JLabel test2 = new JLabel("Test2"); 
      add(test1); 
      add(test2); 
     } 
     @Override 
     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      g.setColor(Color.red); 
      g.fillRect(0, 0, screenSize.width, 200); 
      System.out.print("Reccursion"); 
     } 
    } 
    public class FrontPanel extends JPanel{ 

     public FrontPanel(){ 
      setVisible(true); 
      setOpaque(false); 
      setSize(screenSize); 
      JLabel test = new JLabel("Test"); 
      add(test); 
     } 
     @Override 
     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      g.setColor(Color.blue); 
      g.fillRect(0+screenSize.width/2, 0, screenSize.width/4, 300); 
     } 
    } 
} 
+1

Code ist veraltet, nicht die RepaintManager und Faden nicht berühren pausiert, verwenden SwingTimer, hier für weitere Informationen zu suchen, bevor Oracle Tutorial über Java2D und benutzerdefinierte Malerei zu – mKorbel

+0

ich lesen weiß nicht, wie RepaintManager.currentManager (backPanel) .markCompletelyClean (backPanel); funktioniert. Es ist eine Menge Flaum. Wenn du einen Thread erstellst, der endlackiert, wird das passieren. Sie müssen einen Mechanismus erstellen, um dies zu stoppen. Wenn Sie zum Beispiel nach zwei Malen aufhören zu streichen, legen Sie einen Zähler dort hin. Nenne dein Ziel. – gpasch

Antwort

0

Die Methode „paintcomponent“ wird sehr oft und ohne „Erlaubnis“ genannt (es mir eine harte Zeit zu ist schon ...) Sie nichts dagegen tun kann, erzeuge einfach nicht neue Daten jedes Mal in dieser Methode oder das Aussehen kann sich so oft ändern. Viel Glück

https://books.google.fr/books?id=KXz6AQAAQBAJ&pg=PA211&lpg=PA211&dq=paintcomponent+called+repeatedly&source=bl&ots=AEql59yy51&sig=Ezny1GptXRthd1e0tuQFdM5peoo&hl=fr&sa=X&ved=0ahUKEwjun4j6rJHOAhWK2xoKHYaPCEQ4ChDoAQgkMAE#v=onepage&q=paintcomponent%20called%20repeatedly&f=false

Verwandte Themen