[英]Why is my custom JPanel not being painted / repainted even though I'm painting from the Event Queue and overwriting paintComponent()?
[英]Why is this JPanel still being repainted?
我有一個自定義的JLayeredPane
和兩個自定義的子JPanel
。 我在Thread
的while
循環中重新繪制了所有內容。 我已經用過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”經常被調用,並且沒有您的“權限”(這也讓我很難受...)。您不能對此做任何事情,只是不要每次都用這種方法生成新數據或外觀可能會經常變化。 祝好運
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.