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

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

PS:时间在屏幕的左侧: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); } } 

编辑:

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