-3

編集:

ここでも同じことを行いますが、問題は発生しません。

    import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;


public class MainFrame extends JFrame implements KeyListener {
static long start;
MyPanel right, left;
    public MainFrame() {

    }

    public void go(){
        setUndecorated(true);
        setLocation(0, 0);
        Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setSize(screenSize);
        addKeyListener(this);
        setLayout(new GridLayout(1,0));

        Border b = BorderFactory.createLineBorder(Color.black, 4);
        Border b1 = BorderFactory.createLineBorder(Color.blue, 4);
        right = new MyPanel();
        left = new MyPanel();
        right.setBorder(b); left.setBorder(b1);

        add(left);add(right);


        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }


    public void update() {
        left.update();
        right.update();
}

    @Override
    public void keyPressed(KeyEvent arg0) {
        if (arg0.getKeyCode() == KeyEvent.VK_ESCAPE)
            System.exit(1);
        else if (arg0.getKeyCode() == KeyEvent.VK_RIGHT){
            start = System.currentTimeMillis();
            update();
        }

    }



    @Override
    public void keyReleased(KeyEvent arg0) {}

    @Override
    public void keyTyped(KeyEvent arg0) {}

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MainFrame().go();
            }
        });

    }

}
import java.awt.Graphics;

import javax.swing.JPanel;


public class MyPanel extends JPanel {
    MyPanel(){
        super();
    }
    public void update(){
        repaint();
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        System.out.println(System.currentTimeMillis() -  MainFrame.start);
    }


}

まず第一に、私の問題を示すと思われる小さな例を用意しましたが、このサンプル コードでは問題は発生していません。元のプログラムだけです。読むのが恐ろしいことはわかっていますが、問題は正確に特定の場所にあり、コードの残りの部分を理解したり、数行だけを磨いたりする必要がないため、大いに役立ちます。

  1. GlowneOkno は、すべてを開始する main メソッドを持つメイン クラスです。
  2. Glowne okno は KeyListener であり、JFrame を拡張します。これには、MapaPanel、InfoLiniaPanel、KursPanel の 3 つの拡張 JPanel が含まれています。
  3. キーボードの「右矢印」を押すと、これら 3 つの拡張 JPanel で akutalizuj メソッド (更新メソッド) を呼び出す akutalizuj (更新を意味する) メソッドが実行されることを想定しています。これらのメソッドでは、repaint() が呼び出されます。
  4. クラス GlowneOkno で静的な長い開始を使用して、メソッド GlowneOkno:Aktualizuj がいつ呼び出されるかを確認し、次に、InfoLiniaKurs の paint method() で println(currentTime - GlowneOkno.start) を使用しました (これは時間が表示される場所です -> あなたは見る)。そして、この間隔は非常に遅いので、メソッド akutalizuj Mapa Panel でブロックすると、理由がわかりません

これが私が求めている大きなことであることは知っていますが、理由が見つからないのは5日目であり、質問を形成して、Eclipseですべてのプロジェクトを提供せずに知っておくべきことをすべてそこに置くことができず、あと5時間ほどあります。

プログラムは 1680 x 1050 で動作します

著作権 Robert Kilar 2012 ; )しかし、何らかの形で使用したい場合は、私に尋ねてください。喜んでお手伝いさせていただきます。

メインメインはGlowneOknoクラス。

ESC でアプリを閉じます。

ここに画像の説明を入力

4

1 に答える 1

4

再描画を行うために必要な個々のステップをじっくりと見てください。

  1. InfoLinePaneテキストと時間をレンダリングする必要があります。これ自体は難しいプロセスではありませんが、代わりにその一部をバッファリングされたイメージにオフロードすることを検討できます。時間だけが変わるだけです。他の詳細が変更された場合、バッファを無効にして再描画できます。
  2. InfoLinePane を再度更新しますか?
  3. mapaPanel変更する必要があるかどうかを考慮せずに、マップ名を に割り当てます。
  4. マップをロードします。上記のマップをスケーリングします。拡大縮小された画像のサイズに一致するように、マップ パネルの優先サイズを変更します。
  5. マップを拡大縮小します (再び)
  6. 駅の停留所をペイントします。ストップはその試合を変更しないと確信しています。この結果をバッファリングすることを検討する必要があります。時間が実際に変更されていない限り、進行状況バーを更新してもおそらく意味がありません。

画像の読み込みとスケーリングにはコストがかかります。メモリが許す場合は、これらの結果をキャッシュすることを検討してください。スケーリングはバックグラウンドで行うのが最適です。低品質のスケールを使用して開始し、高品質のスケールを別のスケールにオフロードしますthread

実際に何が変わるかを考えてみましょう。(頻繁に) 変更されないものはすべて、代わりにバッファにレンダリングします。

于 2012-08-21T03:09:43.780 に答える