Не работает обновление формы

 
 
 
Сообщения:4
Здравствуйте!
Суть проблемы такова:
Я создаю форму, на ней JTextField. Я его обновляю в цикле с паузой, Thread.sleep (500). Мне нужно, чтобы информация обновлялась в этом текстовом поле, а на экран выводится только окончательная информация, т.е. setText срабатывает, sleep тоже, но почему-то не работает. Я уже пробовал и repaint, и validate, и revalidate.
Такое ощущение, что форма выводится в окончательном виде только после завершения моего метода showNextExample.
Причем выполнение метода main дебаггером не отлавливается, может ли быть такое, что форма выводится, а main не запускается?
Помогите пожалуйста, очень нужно!

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package excitingarithmetic;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Console;
import java.util.ArrayList;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.Timer;
/**
 *
 * @author husky
 */
public class InteractiveForm extends javax.swing.JFrame {

    /**
     * Creates new form InteractiveForm
     */
    
    
    
    private InteractiveClass interactiveExmpl;
    private int currentExampleNumber;
    
    
    // Номер примера, который на данный момент исполняется
    private int executedExample =0;
    
    public InteractiveForm() {
        
        // Подготовить выражения (случайным образом)
        interactiveExmpl = new InteractiveClass();
        
        initComponents();

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        NumberField = new javax.swing.JTextField();
        answerField = new javax.swing.JFormattedTextField();
        answerBtn = new javax.swing.JButton();
        answerLabel = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        NumberField.setEditable(false);
        NumberField.setFont(new java.awt.Font("Comic Sans MS", 1, 48)); // NOI18N
        NumberField.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        NumberField.setText("empty");

        answerField.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        answerField.setText("0");

        answerBtn.setText("Готово");
        answerBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                answerBtnActionPerformed(evt);
            }
        });

        answerLabel.setText("Введите ответ");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(128, Short.MAX_VALUE)
                .addComponent(NumberField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(126, 126, 126))
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(answerField, javax.swing.GroupLayout.PREFERRED_SIZE, 136, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(answerBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(answerLabel))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(105, 105, 105)
                .addComponent(NumberField, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 36, Short.MAX_VALUE)
                .addComponent(answerLabel)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(answerField, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(answerBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        

    private void answerBtnActionPerformed(java.awt.event.ActionEvent evt) {                                          
        
        // Записывает полученный результат в массив с ответами
        Integer readResult = Integer.parseInt(answerField.getText());
        interactiveExmpl.putInteractiveResults(readResult);
        
        // Если считанное значение совпадает с заложенным ответом, то счетчик правильных ответов плюсуется
        if (readResult==interactiveExmpl.getInteractiveResults().get(currentExampleNumber))
        {
            interactiveExmpl.RightResults++;
        }
        // Показывает следующую очередь из чисел
        this.executedExample++;
        
        showNextExample(executedExample);
    }                                         

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(InteractiveForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(InteractiveForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(InteractiveForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(InteractiveForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                System.out.println("Работает метод main->run");
                new InteractiveForm().setVisible(true);
                System.out.println("Окончил работу метод main->run");
            }
        });
        

    }
    
    // Показывает следующую очередь из чисел
    private void showNextExample(int executedExample)
    {
        System.out.println("Работает метод showNextExample");
        this.repaint();
        this.setVisible(true);
        ArrayList<Integer> numbersInExample = interactiveExmpl.queueExamples.get(executedExample).getNumbersInExample();

                for (Integer number: numbersInExample)
                    {
                        NumberField.setText(number.toString());
                        NumberField.revalidate();
                        
                    try {
                        
                        NumberField.setVisible(false);
                        Thread.sleep(500);
                        NumberField.setVisible(true);
                        this.repaint();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(InteractiveForm.class.getName()).log(Level.SEVERE, null, ex);
                    }
                        repaint();
                    }

        };
    
    
    
    

    // Variables declaration - do not modify                     
    private javax.swing.JTextField NumberField;
    private javax.swing.JButton answerBtn;
    private javax.swing.JFormattedTextField answerField;
    private javax.swing.JLabel answerLabel;
    // End of variables declaration                   
}


  
 
 
Сообщения:139
kirkadev:
Такое ощущение, что форма выводится в окончательном виде только после завершения моего метода showNextExample.

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

 
 
Сообщения:4
но мне-то что делать? Поток отдельный создавать? Если в отдельном потоке эти вещи делать? То будет ли информация обновляться сразу же?
 
 
Сообщения:88
правильно именно в отдельном потоке производить обновление данных и никаких репаинтов и визибле/инвизибл делать не нужно
 
 
Сообщения:300
NumberField.setVisible(true); нужно вызвать один раз.
а repaint постоянно. только не через Thread.sleep() а через Timer.
вот тут глянешь как это делается
 
 
Сообщения:4
Всем спасибо. С таймером Swing заработало. Но нужно учитывать, что на каждое обновление определенного контрола должен выполняться метод таймера. Если запустить цикл, в котором изменяется состояние контрола за одно выполнение метода из таймера - ничего не получится - отобразится результат только последней итерации
 
 
Сообщения:300
похоже, я тебя сбил с толку. метода update это "Main Loop" это цикл нужен для игр с реальным временем. в нём просчитываются изменения мира.
у тебя нет необходимости в этом. у тебя компьютер ждёт твоего ввода, реагирует и ждёт дальше.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет