【发布时间】:2016-07-26 15:15:45
【问题描述】:
我有一个自定义JPanel,在另一个自定义JPanel 后面,在一个JLayeredPane 中。我只想画一次背景JPanel。因为它不会改变。这将节省系统资源。我如何成功地做到这一点?
我知道如果我允许背景 JPanel 像前景 JPanel 一样重复绘制,它会被看到。但这无视我的目标。也就是只画一次。
重新迭代。如何绘制背景 JPanel 一次,然后递归绘制前景 JPanel,而两个 JPanel 都在 JLayeredPane 中看到,其中背景 JPanel 位于前景 JPanel 后面
这是我目前的尝试。这不起作用。这段代码的问题是背景JPanel根本不可见`
这个问题不是重复的,因为人们正在解决不相关的问题。我现在已经让这个问题解决了我想要解决的问题。如果它可以帮助您解决我的问题。那么问题的链接就在这里。 question。 这个问题也有一个糟糕的、毫无意义的答案。我什至仍然尝试过并且不工作。
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){
if (!drawn){
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(0, 0, screenSize.width, 200);
System.out.println("Reccursion");
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);
}
}
}
【问题讨论】:
-
你怎么知道背景JPanel必须重新绘制?另外,为什么只需要绘制一次?
-
@LakshyaGoyal “你怎么知道背景 JPanel 必须重新绘制?”不要明白你在这里想说什么。 “还有,为什么你只需要画一次?”我不需要。我想要。改善我的程序执行方式。这只是一个mvce。不是我的整个程序
-
@resueman 不是。人们从这个问题中得到了错误的想法。所以我决定不编辑问题,而应该做一个新问题。我会在我的问题中链接到它
-
This would save system resources你应该问问自己为什么你认为这是必要的......正如我在你的另一个问题的聊天中引用的那样:premature optimization is the root of all evil