Честно говоря, запутался в том, как применить Swing Timers к моей программе, может кто-нибудь взглянуть?

Я читал о Swing Timers, и пример действительно не похож на то, что я пытался сделать, поэтому я нашел его логически запутанным, чтобы применить его к моей программе. Я начинаю думать, что для этого мне даже не нужен таймер.

Вот что я пытаюсь сделать:

Я делаю программу JFrame, в которой пользователь вводит номер кредитной карты в JTextField. Прежде чем они это сделают, есть JLabel, который говорит: «Пожалуйста, введите свой номер в текстовое поле», затем, как только они введут это в поле и нажмут «Ввод», в зависимости от того, определяет ли мой код, что номер карты действителен или недействителен, JLabel изменится на «Недействительный» или «Спасибо, обработка».

Тем не менее, я безуспешно нашел способ заставить его изменить текст на основе, он просто остается с тем текстом, который я изначально дал.

Так может ли кто-нибудь посмотреть мой код и изменить его, чтобы он делал то, что я прошу? Это было бы превосходно. Вы, ребята, были полезны в прошлом.

public class CreditGraphics {

    public String cardNum;
    public JFrame frame;
    public JPanel panel;
    public JLabel label;
    public JTextField text;
    public Timer timer;

    public CreditGraphics() {
        frame = new JFrame("HI");
        panel = new JPanel();
        label = new JLabel();    
        text = new JTextField(16);    
        panel.add(label);
        panel.add(text);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel.setPreferredSize(new Dimension(500, 500));
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true); 
        label.setText("Hi");          
        label.setText("Hello");
        text.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                cardNum = text.getText();
                timer = new Timer(2000,this);
                timer.setInitialDelay(1000);
                timer.start();
            }                
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new CreditGraphics();

               }
        });
    }

    public void checkCard(){       

    }        
}

person SoloSpirit    schedule 29.07.2014    source источник
comment
Полагаю, это лучше, чем быть нечестно запутанным.   -  person Boris the Spider    schedule 30.07.2014
comment
Джарод - не дубликат, так как ответ на этот вопрос заключается в том, что ему действительно не нужен таймер свинга.   -  person Hovercraft Full Of Eels    schedule 30.07.2014


Ответы (1)


У вас есть некоторые серьезные проблемы с ActionListener вашего Timer, поскольку он добавляет к себе анонимный внутренний объект ActionListener, this в конструкторе Timer. Таким образом, внутри таймера будет вызываться тот же самый actionPerformed, который вызывается кнопкой JButton, которая запускает таймер, что довольно запутанно. Если бы ваша программа нуждалась в Таймере, вы бы сделали правильно, чтобы дать ему свой собственный ActionListener, а не тот же самый ActionListener, который вы добавляете в свой JButton, как вы делаете сейчас.

Самое главное, вам вообще нужен Swing Timer? Я так не думаю, поскольку вы, похоже, не хотите, чтобы действие повторялось каждые xxx миллисекунд или действие, которое происходит один раз через xxx миллисекунд, и поскольку все, что вы хотите сделать, это изменить текст. Вместо этого я предлагаю вам просто изменить текст вашего JLabel в анонимном внутреннем классе ActionListener и оставить все как есть. Если ваши требования отличаются, то вы захотите уточнить и расширить свой вопрос.

Итак, в полупсевдокоде что-то вроде:

public void actionPerformed(ActionEvent e) {
  String userText = text.getText();
  if (testIfTextValid(userText)) { // some method to test if input OK
    label.setText(INPUT_VALID);  // String constant for JLabel to display

    // here pass the userText to other parts of your code that needs to use it

  } else {
    label.setText(INPUT_INVALID);
  }
}
person Hovercraft Full Of Eels    schedule 29.07.2014
comment
Я думал об этом, спасибо :) Я ничего не понял, потому что, честно говоря, не был уверен, что хочу делать со своей программой. Я понял. - person SoloSpirit; 30.07.2014
comment
@SoloSpirit: Добро пожаловать и рад, что у вас есть движение вперед! - person Hovercraft Full Of Eels; 30.07.2014