我有一个自定义JLayeredPane
和两个自定义子JPanel
的。我在Thread
的while
循环中重绘了所有内容。我已使用RepaintManager.currentManager(backPanel).markCompletelyClean(backPanel);
来停止重新绘制backPanel
JPanel
。至于不浪费系统资源。但是,这不起作用。正如我们在paintComponent
方法中看到的那样,如果您运行并编译下面的代码,您将看到在输出中从paintComponent
方法中的System.out.println("Reccursion")
方法调用中递归地重复了语句“Reccursion”。为什么这个JPanel仍然被重新绘制?
为什么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);
}
}
}
你的代码已经过时,不碰的RepaintManager和线程暂停时,使用SwingTimer,更多的信息在这里搜索,前阅读的Java2D甲骨文教程,和风俗画太 – mKorbel
我不知道如何RepaintManager.currentManager(backPanel).markCompletelyClean(backPanel);作品。这是很多绒毛。如果你开始一个线程,重新绘制endlesly这将会发生。你必须创建一些机制来阻止它。例如,如果您想在两次后停止重新绘制,请在该处放置一个计数器。所以陈述你的目标。 – gpasch