LINUX.ORG.RU

Почему не выводит последовательность?

 ,


0

1

Подскажите, почему не выводит последовательно в jLabel1 символы заданной строки, а сразу выводит только последний символ?

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
         text = jTextField1.getText(); 
         char [] MoS  = text.toCharArray(); 
        for (int i = 0; i < MoS.length ; i++) {
            String s = Character.toString(MoS[i]); 
            jLabel1.setText(s); 
            try {
                Thread.sleep(100);
            } catch(InterruptedException ex) {
                ex.printStackTrace();
            }
        }   

если пройтись отладчиком, то видно, что переменная s последовательно значения всех букв введенной строки. Спасибо



Последнее исправление: CYB3R (всего исправлений: 1)

«Не выводит» - это значит не рисует на форме? На яве не писал, но уверен, что дело до отрисовки вообще не доходит. Тут нужно таймер запускать, который каждый тик будет менять буковку в jLabel1.

kulti ★★
()

Потому что нет команды «перерисовать» изменившийся элемент. Он перерисовывается только когда твой метод завершается. Попробуй написать что-то вроде

[code=java]
frame.getContentPane().validate();
frame.getContentPane().repaint();
[/code]

перед Thread.sleep.

А вообще такой подход неверен, т.к. окно не отвечает на действия пользователя, пока выполняется метод, а это неприемлемое поведение. Тебе надо использовать что-то вроде таймера и обновлять текст надписи в нём.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

ты имеешь ввиду, что сама идея выводить посимвольно - плохая идея и по таймеру обновлять надпись целиком?

Batters
() автор топика
Ответ на: комментарий от Batters

Плохая идея — внутри обработчика делать цикл, в котором обновлять элементы GUI и делать паузу. Тело цикла должно вызываться по таймеру, а состояние (счетчик) храниться например в поле класса. Или выполнять цикл в отдельном потоке.

Legioner ★★★★★
()

Можно попробовать сразу после setText вызывать:

jLabel1.repaint();
Но в «серьезном» коде тред, занимающийся интерфейсом пользователя, не должен спать, как медведь зимой, он должен реагировать на действия пользователя.

proud_anon ★★★★★
()

Изменение текста по времени нужно делать отдельным тредом чтобы он не блочил интерфейс всей программы.
В свое время задавался этим же вопросом, вот посмотри тут:
Java GUI

TDrive ★★★★★
()
Ответ на: комментарий от Batters

ты в dispatch thread, так что у тебя отрисовка не работает пока ты что-то делаешь.

maxcom ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.