2016-07-26 7 views
0

私はカスタムJLayeredPaneと2つのカスタムチャイルドJPanelを持っています。 whileループ内のすべてのものをThreadに書き換えます。私はを使用して、再塗りを中止しました。backPanelJPanelシステムリソースを無駄にしないようにする。ただし、これは機能しません。 paintComponentメソッドで確認できるように、以下のコードを実行してコンパイルすると、paintComponentメソッドのSystem.out.println("Reccursion")メソッド呼び出しから "Reccursion"という文が繰り返し出力されることがわかります。このJPanelはまだ再描画されていますか?

はなぜbackPanelJPanelまだ再描画されていると私はRepaintManager.currentManager(backPanel).markCompletelyClean(backPanel);を使用している場合は、なぜ、まだ呼び出されているメソッドSystem.out.println("Reccursion")です。あなたはそれについて何もできない

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

あなたのコードが古くなっている、のRepaintManagerに触れるとスレッドを一時停止し、より多くの情報を検索するために2Dでおよそオラクルチュートリアル、およびカスタムペイントを読むために前に、SwingTimerを使用していない、あまりにも – mKorbel

+0

Iドント; t RepaintManager.currentManager(backPanel).markCompletelyClean(backPanel);働くそれは多毛です。あなたがendelylyを再描画するスレッドを開始する場合、それは何が起こるのでしょう。あなたはそれを止めるための何らかの仕組みを作り出さなければなりません。たとえば、2回後に再塗りを止める場合は、そこにカウンタを置く。あなたの目標を述べてください。 – gpasch

答えて

0

方法「paintComponent」はかなり頻繁に、あなたの「許可」なしで呼び出された(それがあまりにも私の苦労を与えています...) 、単に生成されません。この方法で毎回新しいデータを使用するか、外観が頻繁に変更される可能性があります。 幸運

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

関連する問題