-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 是一个主类,它有一个启动它的主方法。
  2. Glowne okno 是 KeyListener 和 Extends JFrame,它包含 3 个扩展的 JPanel:MapaPanel、InfoLiniaPanel、KursPanel。
  3. 当您按下键盘上的“右箭头”时,它假设运行 akutalizuj(它意味着更新)方法,该方法在这 3 个扩展的 JPanel 中调用 akutalizuj 方法(更新方法)。在这些方法中,调用了 repaint()。
  4. 我在 GlowneOkno 类中使用静态长启动来查看何时调用 GlowneOkno:Aktualizuj 方法,然后我在 InfoLiniaKurs 的绘制方法()中 println(currentTime - GlowneOkno.start)(这是显示时间的那个 -> 你会看)。而且这个时间间隔太慢了,我不知道为什么,如果我在方法 akutalizuj Mapa Panel 中阻塞

我知道这是我要问的一件大事,但这是我找不到理由的第五天,我无法提出问题并将您应该知道的所有内容放在那里,而无需在 Eclipse 中提供所有项目,而我还有 5 个多小时的时间。

程序工作在 1680 x 1050

罗伯特·基拉尔 2012 年版权所有;) 但如果你想以某种方式使用它,就问我。我很乐意提供帮助。

主要主要在 GlowneOkno 类。

ESC 关闭应用程序。

在此处输入图像描述

4

1 回答 1

4

仔细查看重新绘制所需的每个单独步骤。

  1. InfoLinePane需要渲染文本和时间。虽然这本身并不是一个困难的过程,但您可以考虑将其中的一些卸载到缓冲图像中,因为让我们面对现实吧,只是时间会发生变化。当其他细节发生变化时,您可以使缓冲区无效并重新绘制它。
  2. 您再次更新 InfoLinePane...?
  3. 您将地图名称分配给 ,mapaPanel而无需考虑是否需要更改
  4. 你加载地图。你缩放所说的地图。您更改地图面板的首选大小以匹配缩放图像的大小
  5. 你缩放地图(再次)
  6. 你画车站。我很确定止损不会改变匹配,你应该考虑缓冲这个结果。除非时间实际上已经改变,否则更新进度条可能没有意义。

图像加载和缩放是昂贵的。如果内存允许,您应该考虑缓存这些结果。缩放最好在后台实现。使用低质量进行扩展,然后将高质量的规模卸载到单独的thread

考虑实际发生的变化。将所有不会(经常)更改的内容渲染到缓冲区。

于 2012-08-21T03:09:43.780 回答