私はカスタムJLayeredPane
と2つのカスタムチャイルドJPanel
を持っています。 while
ループ内のすべてのものをThread
に書き換えます。私はを使用して、再塗りを中止しました。backPanel
JPanel
システムリソースを無駄にしないようにする。ただし、これは機能しません。 paintComponent
メソッドで確認できるように、以下のコードを実行してコンパイルすると、paintComponent
メソッドのSystem.out.println("Reccursion")
メソッド呼び出しから "Reccursion"という文が繰り返し出力されることがわかります。このJPanelはまだ再描画されていますか?
はなぜbackPanel
JPanel
まだ再描画されていると私はRepaintManager.currentManager(backPanel).markCompletelyClean(backPanel);
を使用している場合は、なぜ、まだ呼び出されているメソッドSystem.out.println("Reccursion")
です。あなたはそれについて何もできない
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に触れるとスレッドを一時停止し、より多くの情報を検索するために2Dでおよそオラクルチュートリアル、およびカスタムペイントを読むために前に、SwingTimerを使用していない、あまりにも – mKorbel
Iドント; t RepaintManager.currentManager(backPanel).markCompletelyClean(backPanel);働くそれは多毛です。あなたがendelylyを再描画するスレッドを開始する場合、それは何が起こるのでしょう。あなたはそれを止めるための何らかの仕組みを作り出さなければなりません。たとえば、2回後に再塗りを止める場合は、そこにカウンタを置く。あなたの目標を述べてください。 – gpasch