0

我有以下代码被调用:

    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());
}

这就是对我有用的一切。我需要两个电话。两者都不能单独工作。我不喜欢这样做,但显然是因为效率低下.. :/ 有什么想法吗?

谢谢!

4

2 回答 2

0

你应该覆盖JPanel的

paintComponent(Graphics g)

不画画

于 2012-04-13T03:23:32.573 回答
0

mainFrame.repaint()强制地图刷新的原因是因为repaint()调用repaint(0, 0, 0, width, height),它会将整个mainFrame's 区域标记为RepaintManager. 这是故意这样设计的,因为您通常不想为了更新组件而重新绘制 JFrame 中的每个像素。所以,在onTick()mainFrame.paintAll()调用时,我的猜测是mapPanel' 区域没有被标记为脏,所以RepaintManager跳过它,以节省处理时间。如果您非常确定每次调用时都想重新绘制整个 mapPanel ,那么最简单的方法是在您的方法内部onTick()调用。这会将整体标记为脏,因此将尽快重绘。此外,如果您的mapPanel.repaint()onTick()mapPanelmenuPanel只是使用常规的swing JComponents,您不需要手动使它们重新绘制,如果您正确使用API​​​​,当它们的值更改时它们将被重新绘制。

我知道这是一个老问题,但我想我会回答,以防其他人遇到类似问题。

于 2012-10-11T15:47:19.733 回答