java - How to successfully draw background JPanel once and update foreground JPanel constantly? -
i have custom jlayeredpane, , repainting in game loop. there 2 custom jpanels added jlayeredpane. these foreground , background jpanels. how draw background jpanel once, (and repaint when window re-sized or other reason) reduce impact on system resources, while continuing update foreground jpanel constantly.
to re-iterate, dont want repaint background jpanel in loop. want repaint when nessessary, background not change. , large.
in attempt this, have drawn background once. however. background jpanel not visible. while foreground jpanel updates normal. if foreground jpanel paints ontop of background jpanel, though have both of jpanels set setopaque(false)
i have made mvce shows attempt @ drawing background jpanel once, while updating foreground jpanel constantly.
the problem code background jpanel not show.
now. know if draw show. defeats purpose of i'm trying do. trying draw once, , have seen @ same time
my code draws background jpanel once. problem background jpanel not show. how fix problem
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(); } public static void main(string[] args) { screensize = toolkit.getdefaulttoolkit().getscreensize(); frame = new jframe("game"); // use 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); drawonce(g); } public void drawonce(graphics g){ if (!drawn){ g.setcolor(color.red); g.fillrect(0, 0, screensize.width, 200); drawn=true; } } } 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); } } }
try repaintmanager.currentmanager(component).markcompletelyclean(component). prevent component repainting. might need after each time add new components.
Comments
Post a Comment