2016-07-26 56 views
0

我有一个自定义JLayeredPane和两个自定义子JPanel的。我在Threadwhile循环中重绘了所有内容。我已使用RepaintManager.currentManager(backPanel).markCompletelyClean(backPanel);来停止重新绘制backPanelJPanel。至于不浪费系统资源。但是,这不起作用。正如我们在paintComponent方法中看到的那样,如果您运行并编译下面的代码,您将看到在输出中从paintComponent方法中的System.out.println("Reccursion")方法调用中递归地重复了语句“Reccursion”。为什么这个JPanel仍然被重新绘制?

为什么backPanelJPanel仍然被粉刷一新,为什么仍然被调用的方法System.out.println("Reccursion"),当我用RepaintManager.currentManager(backPanel).markCompletelyClean(backPanel);

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和线程暂停时,使用SwingTimer,更多的信息在这里搜索,前阅读的Java2D甲骨文教程,和风俗画太 – mKorbel

+0

我不知道如何RepaintManager.currentManager(backPanel).markCompletelyClean(backPanel);作品。这是很多绒毛。如果你开始一个线程,重新绘制endlesly这将会发生。你必须创建一些机制来阻止它。例如,如果您想在两次后停止重新绘制,请在该处放置一个计数器。所以陈述你的目标。 – 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

相关问题