Возможный дубликат:
использование sleep() для одного тема
У меня проблемы с JTextField.setText() при использовании Thread.sleep(). Это для простого калькулятора, который я делаю. Когда ввод в поле ввода имеет неправильный формат, я хочу, чтобы «ОШИБКА ВВОДА» отображалась в поле вывода в течение 5 секунд, а затем очищалась. Метод setText() сработал, когда я только что один раз установил для текста значение «ОШИБКА ВВОДА», и, распечатав промежуточный текст, я обнаружил, что он работает как с этим, так и с setText(""). после другого. Проблема возникает, когда я помещаю между ними Thread.sleep(). Вот версия кода SSCCE:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Pattern;
import javax.swing.*;
public class Calc {
static Calc calc = new Calc();
public static void main(String args[]) {
GUI gui = calc.new GUI();
}
public class GUI implements ActionListener {
private JButton equals;
private JTextField inputField, outputField;
public GUI() {
createFrame();
}
public void createFrame() {
JFrame baseFrame = new JFrame("Calculator");
baseFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPane = new JPanel();
BoxLayout layout = new BoxLayout(contentPane, BoxLayout.Y_AXIS);
contentPane.setLayout(layout);
baseFrame.setContentPane(contentPane);
baseFrame.setSize(320, 100);
equals = new JButton("=");
equals.addActionListener(this);
inputField = new JTextField(16);
inputField.setHorizontalAlignment(JTextField.TRAILING);
outputField = new JTextField(16);
outputField.setHorizontalAlignment(JTextField.TRAILING);
outputField.setEditable(false);
contentPane.add(inputField);
contentPane.add(outputField);
contentPane.add(equals);
contentPane.getRootPane().setDefaultButton(equals);
baseFrame.setResizable(false);
baseFrame.setLocation(100, 100);
baseFrame.setVisible(true);
}
/**
* When an action event takes place, the source is identified and the
* appropriate action is taken.
*/
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == equals) {
inputField.setText(inputField.getText().replaceAll("\\s", ""));
String text = inputField.getText();
System.out.println(text);
Pattern equationPattern = Pattern.compile("[\\d(][\\d-+*/()]+[)\\d]");
boolean match = equationPattern.matcher(text).matches();
System.out.println(match);
if (match) {
// Another class calculates
} else {
try {
outputField.setText("INPUT ERROR"); // This doesn't appear
Thread.sleep(5000);
outputField.setText("");
} catch (InterruptedException e1) {
}
}
}
}
}
}
На самом деле я не использую вложенный класс, но я хотел, чтобы он мог содержаться в одном классе для вас. Извините за то, как выглядит графический интерфейс, но опять же, это было сделано для сокращения кода. Важный раздел (if (e.getSource() == equals)
) остается неизменным по сравнению с моим кодом. Самый простой способ дать неправильный ввод — использовать буквы.
System.out.println()
там, чтобы увидеть, дойдет ли он до этой точки - person tckmn   schedule 01.01.2013