我有类似的东西(现在时间显示正确)。我已经添加KeyListener
到JFrame
这些 JPanel 所在的位置。当我按 ->(右键)时,我想时间增加一,它确实如此,但它真的很慢(比如等待 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();}
}