为什么重新粉刷需要花费这么多时间?

时间:2012-08-18 03:48:15

标签: java swing jpanel drawstring

我有类似的东西(时间现在正确显示)。我已将KeyListener添加到这些JPanel所在的JFrame。当我按下 - >(右键)时我希望时间增加一个而它确实增加但它确实很慢(比如等待3秒甚至更长)。 程序中的算法不是故障(没有GUI检查,它们很快)。有没有办法加快反应速度 - >按键 - >改变时间。图像是png所以它应该很快。每当我想要刷新时,我都会调用aktualizuj()。

PS:时间在屏幕的左侧:14:28

enter image description here

import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;

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


public class InfoLiniaPanel extends JPanel {
Linia linia;
Dimension d;
int nrPrzystanku;
    public InfoLiniaPanel(Linia linia) {
        super();
        this.linia = linia;
        nrPrzystanku = 0;
        go();
    }

    public void go(){
    d = new Dimension(java.awt.Toolkit.getDefaultToolkit().getScreenSize().width/4, java.awt.Toolkit.getDefaultToolkit().getScreenSize().height/2);
    setPreferredSize(d);        
        Border b = BorderFactory.createLineBorder(Color.red, 4);
        setBorder(b);       
    }

    public void aktualizuj(int nrPrzystanku){
        this.nrPrzystanku = nrPrzystanku;
        revalidate();
        repaint();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        int Height = (int) d.getHeight(), Width = (int) d.getWidth();
    //  System.out.println("PAINT W InfoLiniaPanel");
        Font f = new Font(Font.SANS_SERIF,Font.BOLD, (4 *Height/10));
        g.setFont(f);
    //  System.out.println(Height);
        //rysowanie numeru linii
        g.drawString(linia.nr + "", Width/10, Height/3);
        //rysowanie czasu
        Font f1 = new Font(Font.SANS_SERIF,Font.BOLD, 2 * Height/18);
        g.setFont(f1);
        g.drawString(linia.czas +" ", Width/10 +  g.getFontMetrics(f).stringWidth(linia.nr+"") + Width/10, Height/3);
        //kierunek
    //  System.out.println(linia.kurs.get(linia.kurs.size() -1 ).kierunek);
        g.setFont( new Font(Font.SANS_SERIF,Font.BOLD,1 *Height/20));
        g.drawString(linia.kurs.get(linia.kurs.size() -1 ).kierunek + "",
                 Width/10 + g.getFontMetrics(f).stringWidth(linia.nr+"") + Width/10,
                 Height/3 - g.getFontMetrics(f1).getAscent() /*g.getFontMetrics(f1).getHeight()*/ );
    //      System.out.println(g.getFontMetrics(f1).getHeight());
        //nastepny przystanek
    //  System.out.println(linia.kurs.get(nrPrzystanku)); //TRZEBA ZMIENIC NA JAKIS INDEKS ZEBY SZLA SYMULKACJA!!!!!!
        //NAJLEPIEJ DAC POLE OBECNY PRZYSTANEK W KLASIE LINIA
        g.drawString("Następny przystanek:" , Width/10, Height/3 + g.getFontMetrics().getHeight() + Height/10);
        g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,1 *Height/18));
        g.drawString(linia.kurs.get(nrPrzystanku).nazwa+"", Width/10, Height/3 + g.getFontMetrics().getHeight()*12/6 + Height/10);


    }

    public static void main(String[] args) {
        new InfoLiniaPanel(new Linia(4));
        JFrame jf = new JFrame();
        jf.setSize(400,400);
        jf.add(new InfoLiniaPanel(new Linia(4)));
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

}

编辑:

@Override
public void keyPressed(KeyEvent arg0) {
    if (arg0.getKeyCode() == KeyEvent.VK_ESCAPE)
        System.exit(1);
    if (arg0.getKeyCode() == KeyEvent.VK_RIGHT){
        l.czas.addMinuty(1);
        aktualizuj();
    }

}


public void aktualizuj(){
    //System.out.println("Akutalizuj");

try{

    liniaPanel.aktualizuj(nrPrzystankuZKolei);
//  System.out.println(l.kurs.get(nrPrzystankuZKolei + 1).czas.equals(l.czas));
    if (nrPrzystankuZKolei < (l.kurs.size()-1) && l.kurs.get(nrPrzystankuZKolei + 1).czas.compareTo(l.czas) <= 0) {
        /*  System.out.println(l.czas + " "
                    + l.kurs.get(nrPrzystankuZKolei).czas + " "
                    + l.kurs.get(nrPrzystankuZKolei + 1).czas);
            System.out.println("Pora nanastepny przystanek");
            System.out.println(l.kurs.get(nrPrzystankuZKolei + 1));
            System.out.println(l.czas); */
            nrPrzystankuZKolei++;// przejscie do kolejnego przystanku
            liniaPanel.aktualizuj(nrPrzystankuZKolei);
            //mapa
            mapaPanel.sciezka = Linia.trasa[nrPrzystankuZKolei].substring(0,  Linia.trasa[nrPrzystankuZKolei].length() - 2)+".png";
            ((MapaPanel) mapaPanel).aktualizuj();
            //kurs
            ((KursPanel) kursPanel).aktualizuj(nrPrzystankuZKolei);
        }

}catch(Exception e){e.printStackTrace();}
}

0 个答案:

没有答案