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

ここに私の問題があります。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());
}

これが私のために働いたすべてです。両方の呼び出しが必要です。どちらも単独では機能しません。明らかに非効率なため、これを行うのは好きではありません.. :/ 何かアイデアはありますか?

ありがとう!

4

2 に答える 2

0

JPanelのをオーバーライドする必要があります

paintComponent(Graphics g)

塗らない

于 2012-04-13T03:23:32.573 に答える
0

mainFrame.repaint()マップを強制的に更新する理由は、 の領域全体を の「ダーティ」としてマークする をrepaint()呼び出すためです。通常、コンポーネントを更新するためだけに JFrame のすべてのピクセルを再描画することは望ましくないため、これは意図的にこのように設計されています。したがって、 でが呼び出されたとき、の領域はダーティとマークされていないので、処理時間を節約するために はそれをスキップします。が呼び出されるたびに mapPanel 全体を再描画することが確実な場合は、メソッド内で呼び出すのが最も簡単な方法です。これにより、全体がダーティとしてマークされるため、できるだけ早く再描画されます。また、repaint(0, 0, 0, width, height)mainFrameRepaintManageronTick()mainFrame.paintAll()mapPanelRepaintManageronTick()mapPanel.repaint()onTick()mapPanelmenuPanelAPI を正しく使用していれば、値が変更されたときに再描画されます。

これは一種の古い質問であることは知っていますが、他の誰かが同様のことに遭遇した場合に備えて答えると思いました.

于 2012-10-11T15:47:19.733 に答える