JPanel 内で呼び出されるメソッドを無効にすることに問題があります。フレームのグラフィックスを制御する 2 つの JPanel を使用してフレームをセットアップしました。問題は、Frame に新しい JPanel を作成し、以前そこにあった古い JPanel も削除した場合、古い JPanel の paint メソッドが引き続き呼び出されることです。
これをテストするために使用したコードは次のとおりです。
開始クラス:
import java.awt.Frame;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class Start implements WindowListener, KeyListener{
public static void main(String[] args) {
new Start();
}
Frame frame = new Frame("Frame");
TestPanel P1 = new TestPanel();
TestPanel P2 = new TestPanel();
static boolean active = true;
public Start() {
frame.setSize(500,500);
frame.setLocationRelativeTo(null);
frame.addWindowListener(this);
frame.addKeyListener(this);
frame.setVisible(true);
frame.add(P1);
for (Object c : frame.getComponents()){
System.out.println(c.toString());
}
}
@Override
public void keyPressed(KeyEvent e) {
if (active){
frame.remove(P1);
frame.add(P2);
}else{
frame.remove(P2);
frame.add(P1);
}
active = !active;
for (Object c : frame.getComponents()){
System.out.println(c.toString());
}
}
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
public void windowOpened(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
}
TestPanel クラス:
import java.awt.Graphics;
import javax.swing.JPanel;
public class TestPanel extends JPanel{
boolean active = Start.active;
@Override
public void paint(Graphics g) {
System.out.println(active);
}
}
このプログラムは、オブジェクト P1 のみがアクティブであり、画面に表示されていても P2 は何もしていないことを示す「true」を常に出力します。
だから私が求めているのは、P1オブジェクトが画面上にないときに呼び出されるペイントメソッドを取得するのをやめ、P2オブジェクトが表示されているときにペイントメソッドが呼び出されるようにする方法です。