2016-07-10 23 views
0

Hallo Ich bin ein Programm erstellen, wo der Benutzer bestimmte Eingaben geben muss, um Punkte zu erhalten und es gibt einen Timer, aber der Timer ist ich erstellt wird den Cursor im jtextfield zu schnell blinken, damit das Programm zeitweise Eingaben macht. In meiner Timer-Klasse habe ich TimerTask importiert und timer.scheduleAtFixedRate() verwendet, um die Zeit zu zählen. Das ist nicht alles mein Code, aber das ist die Hauptklasse.jtextfield Cursor blinkt zu schnell und registriert keine Eingabe zu Zeiten

import javax.swing.*; 
    import java.awt.*; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 

class Interface extends JPanel implements ActionListener { 

private JTextField textField; 
private int fontSize; 
private Font font; 
private GridBagConstraints c = new GridBagConstraints(); 
private int x, y; 
private collection userInputData; 
private boolean initialized = false; 
private String[] answers; 
private String[] questions; 
private int points = 0; 

private timer timer; 

private boolean timerStarted = false; 

Interface() { 
    super(new GridBagLayout()); 
    x = 0; 
    y = 0; 
    userInputData = new collection(); 
    setBackground(Color.BLACK); 


    timer = new timer(60); 

    questions = new String[] {"a", "b", "c", "d"}; 

    answers = new String[] {"a","b","c","d","e","f","g" }; 

    /*questions = new String[] {"云", "人", "口", "一"}; 

    answers = new String[] {"去","十","二","大","运","中","丁" };*/ 

} 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    fontSize = getWidth()/25; 
    Font font = new Font(g.getFont().getFontName(), Font.BOLD, fontSize); 
    g.setFont(font); 
    g.setColor(Color.WHITE); 
    if(initialized){ 
     updateUserDataFrame(); 
     updateFrame(); 
     textField.requestFocus(); 
    } 
    if (!timer.timeUp()) { 
     questions(g); 
     fontSize = getWidth()/50; 
     Font n = new Font(g.getFont().getFontName(), Font.BOLD, fontSize); 
     g.setFont(n); 
     displayTimer(g); 
     points(g); 
     displayUserInput(g); 
    } 

    if (timer.timeUp()) { 
     displayScoreboard(g); 
     remove(textField); 
    } 

} 

private void displayTimer(Graphics g) { 
    if (!timerStarted) { 
     timer.start(); 
     timerStarted = true; 
    } 

    //fontSize = getWidth()/35; 
    timer.setColor(Color.RED); 
    timer.setPosition(getWidth() - (int) (getWidth()), fontSize); 
    timer.displayTimer(g); 

    repaint(); 
} 

private void displayScoreboard(Graphics g) { 
    int x = getWidth()/50; 
    int y = getHeight()/5; 
    g.drawString("Your Answers:", x, y); 
    /* String correctWrongNumber = "Correct: " + correctAnswers + " " 
      + "Wrong: " + (question.length - correctAnswers); 
    x = getWidth() - g.getFontMetrics().stringWidth(correctWrongNumber) - getWidth()/25; 
    g.drawString(correctWrongNumber, x, y); 
    x = getWidth()/50; 
    y += getHeight()/15 + fontSize; 
    for (int i = 0; i < studentAnswers.length; i++) { 
     g.drawString(i + 1 + ". " + studentAnswers[i], x, y); 
     x += getWidth()/10.5; 
    }*/ 

} 

private void points(Graphics g) { 
    int x = getWidth()/4; 
    int y = getHeight()/4; 
    g.setColor(Color.white); 
    g.drawString("Points: " + points, x, y); 
} 

private void questions(Graphics g) { 
    int x = getWidth()/4; 
    int y = getHeight()/8; 
    int borderY = getHeight() /60; 
    fontSize = getWidth()/15; 
    Font font = new Font(g.getFont().getFontName(), Font.BOLD, fontSize); 
    g.setFont(font); 
    for(int i = 0; i < questions.length; i++) { 

     g.setColor(Color.red.brighter()); 
     g.fillRect(x + 1, borderY, fontSize, fontSize); 
     g.setColor(Color.orange.brighter()); 
     g.drawRect(x, borderY, fontSize, fontSize); 
     g.setColor(Color.white); 
     g.drawString(questions[i],x,y); 
     x += getWidth()/6; 
    } 

} 

private void updateFrame() { 

    fontSize = getWidth()/20; 
    font = new Font("SansSerif", Font.BOLD, fontSize); 
    textField.setFont(font); 
    c.insets = new Insets(0, 0, getHeight()/2, 0); 
    remove(textField); 
    add(textField, c); 
} 

private void updateUserDataFrame(){ 
    int x = getWidth()/60; 
    int y = getHeight()/3 + getHeight()/20; 
    int width = getWidth()/16; 
    int height = getWidth()/16; 
    int fontSize = getWidth()/20; 
    Font font = new Font("SansSerif", Font.BOLD, fontSize); 

    userInputData.reset(); 
    while(userInputData.hasNext()){ 
     structure temp = (structure)userInputData.next(); 
     x += getWidth()/16; 
     temp.updateData(font, x, y, width, height); 
    } 
} 

private void displayUserInput(Graphics g) { 
    userInputData.paint(g); 

} 

void init(){ 
    x = getWidth()/60; 
    y = getHeight()/3 + getHeight()/20; 
    fontSize = getWidth()/20; 
    font = new Font("SansSerif", Font.BOLD, fontSize); 

    textField = new JTextField(3); 
    textField.setFont(font); 
    textField.addActionListener(this); 
    //Add Components to this panel. 
    c.insets = new Insets(0, 0, getHeight()/2, 0); 
    c.gridx = 0; 
    c.gridy = 0; 
    add(textField, c); 
    updateUI(); 
    initialized = true; 
    repaint(); 


} 

@Override 
public void actionPerformed(ActionEvent e) { 
    int buttonWidth = getWidth()/16; 
    int buttonHeight = getWidth()/16; 
    x += getWidth()/16; 
    String userInput = textField.getText(); 
    for(int i = 0; i < answers.length; i++) { 
     if(answers[i].equals(textField.getText())) 
      points++; 
    } 
    userInputData.add(new structure(userInput, Color.WHITE, font,x,y,buttonWidth,buttonHeight)); 
    textField.setText(""); 
    repaint(); 
} 
} 

Editiert: Timer-Klasse

import java.awt.*; 
    import java.util.Timer; 
    import java.util.TimerTask; 

class timer { 
private Timer timer = new Timer(); 
private int timeLimit; 
private int x, y; 
private Color color; 
private TimerTask task = new TimerTask() { 
    public void run() { 
     timeLimit--; 
     if(timeLimit == 0){ 
      timer.cancel(); 
     } 
    } 
}; 

timer() { 
    timeLimit = 120; 
} 

timer(int limit) { 
    timeLimit = limit; 
} 

void start() { 
    timer.scheduleAtFixedRate(task, 1000, 1000); 
} 

void displayTimer(Graphics g) { 
    int minute = timeLimit/60; 
    int second = timeLimit % 60; 
    g.setColor(color); 
    if (minute < 10) { 
     if (second < 10) 
      g.drawString("0" + minute + ":0" + second, x, y); 

     else 
      g.drawString("0" + minute + ":" + second, x, y); 

    } else { 
     if (second < 10) 
      g.drawString(minute + ":0" + second, x, y); 

     else 
      g.drawString(minute + ":" + second, x, y); 

    } 
} 

void setColor(Color color) { 
    this.color = color; 
} 

void setPosition(int x, int y) { 
    this.x = x; 
    this.y = y; 
} 

int getTime() { 
    return timeLimit; 
} 

void setTime(int time) { 
    timeLimit = time; 
} 

boolean timeUp() { 
    return timeLimit == 0; 
} 

} 

Antwort

0

Ich verstehe nicht, wo diese timer herkommt? Sie können diesen Code verwenden Timer timer = new Timer(1000,this); anstelle von timer timer = new timer(60);

1000 aktivieren, um Sie mit echtem Timer zu verwenden.

Ich hoffe, dass dies das Leben ein wenig leichter machen wird.

+0

Sorry, ich habe eine separate Timer-Klasse gemacht. Ich werde es hinzufügen. –