簡體   English   中英

為什么仍要重新粉刷此JPanel?

[英]Why is this JPanel still being repainted?

我有一個自定義的JLayeredPane和兩個自定義的子JPanel 我在Threadwhile循環中重新繪制了所有內容。 我已經用過RepaintManager.currentManager(backPanel).markCompletelyClean(backPanel); 停止重新繪制backPanel JPanel 為了不浪費系統資源。 但是,這不起作用。 正如我們在paintComponent方法中看到的那樣,如果運行並編譯下面的代碼,您將看到在輸出中從系統中System.out.println("Reccursion")方法調用中遞歸地重復了語句“ Reccursion”。 paintComponent方法。

為什么當我使用RepaintManager.currentManager(backPanel).markCompletelyClean(backPanel); ,為什么仍要重新繪制backPanel JPanel以及為什么仍然要調用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);
        }
    }
}

方法“ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM