次のコードが呼び出されています。
while(true){
view.onTick();
trySleep(55);
}
onTick() メソッドは次のように記述されています。
public void onTick() {
mainFrame.paintAll(mainFrame.getGraphics());
}
ここで、JFrame と JPanels などをセットアップします (mainFrame は JFrame です)。
private void runProgramSetup(){
JPanel canvas = new JPanel();
canvas.setLayout(new BoxLayout(canvas, BoxLayout.Y_AXIS));
mainFrame.getContentPane().add(canvas);
//create the main game panel
mapPanel = new MapPanel(model, this);
mapPanel.setPreferredSize(new Dimension(TOTAL_FRAME_WIDTH, MAP_PANEL_HEIGHT));
mapPanel.setBackground(Color.cyan);
//create the menu panel
menuPanel = new MenuPanel(model, this);
menuPanel.setLayout(new BoxLayout(menuPanel, 0));
menuPanel.setPreferredSize(new Dimension(TOTAL_FRAME_WIDTH, MENUS_PANEL_HEIGHT));
//add the panels to the window
canvas.add(mapPanel);
canvas.add(menuPanel);
//make both panels visible
mapPanel.setVisible(true);
menuPanel.setVisible(true);
}
ここに私の問題があります。mapPanel のオーバーライドされた paint(Graphics g) メソッドを除いて、 repaintAll() が呼び出されると、すべてが再描画されます。
@Override
public void paint(Graphics g) {
transformedImages.transformAndStoreImages(model);
paintGrid(g);
paintScenery(g);
paintElements(g);
paintDraggedElement(g);
paintUIOverlay(g);
}
一度だけ呼び出されます。それだ。ただし、他のすべてのコンポーネントは引き続き再描画されます。一度ペイントするのは mapPanel だけです。これがさらに奇妙なことです。Ubuntu で実行していますが、この問題が発生します。私のチームの残りのメンバーは Mac で実行していますが、この問題は発生していません。これを解決できた唯一の方法は、onTick() を 2 つのペイント呼び出しに置き換えることです。
public void onTick() {
mainFrame.repaint();
mainFrame.paintAll(mainFrame.getGraphics());
}
これが私のために働いたすべてです。両方の呼び出しが必要です。どちらも単独では機能しません。明らかに非効率なため、これを行うのは好きではありません.. :/ 何かアイデアはありますか?
ありがとう!