我有以下代码被调用:
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);
}
现在这是我的问题。调用 repaintAll() 时,所有内容都会重新绘制,除了 mapPanel 的重写 paint(Graphics g) 方法:
@Override
public void paint(Graphics g) {
transformedImages.transformAndStoreImages(model);
paintGrid(g);
paintScenery(g);
paintElements(g);
paintDraggedElement(g);
paintUIOverlay(g);
}
它只被调用一次。这就对了。但是,所有其他组件都会继续重新绘制。只有 mapPanel 绘制一次。更奇怪的是。我在 Ubuntu 上运行并遇到此问题。我团队的其他成员都在 Mac 上运行,他们没有这个问题。我能够解决这个问题的唯一方法是用两个绘制调用替换 onTick() :
public void onTick() {
mainFrame.repaint();
mainFrame.paintAll(mainFrame.getGraphics());
}
这就是对我有用的一切。我需要两个电话。两者都不能单独工作。我不喜欢这样做,但显然是因为效率低下.. :/ 有什么想法吗?
谢谢!