Why repainting of that take so much time?

一个人想着一个人 提交于 2019-12-02 22:13:39

问题


I have something like that (the time is now displayed correctly). I have added KeyListener to the JFrame in which these JPanels are. When I press ->(right key) I want to time to increment by one and it does but it is really slow(like 3 seconds of waiting then even much longer). The algorithms in program are not the fault(checked without GUI, they're fast). Is there any way to faster the reaction ->pressing key-> changing time. The image is png so it should be fast. I call aktualizuj() every time I want to refresh.

PS: THE TIME IS ONT THE LEFT SIDE OF THE SCREEN: 14:28

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

    }

}

EDIT:

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

来源:https://stackoverflow.com/questions/12015667/why-repainting-of-that-take-so-much-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!