2013-02-12 2 views
1

Я написал программу, которая показывает JFrame, содержащую информацию о машине, которая ее запускает (HOST и IP), и она делает подключение JDBC для отображения другой информации.Дисплей с задержкой на JFrame

Я только эти две строки в моей main функции:

NewFrame nf = new NewFrame(); //Here I make all the needed calculations 
nf.setVisible(true); 

(NewFrame расширяет JFrame)

В конструкторе я выполнить все необходимые расчеты и установить их, чтобы показать в nf JFrame ,

Когда я запускаю программу, я вижу границу в JFrame для 0,5-1 секунд до того, как наполняются информацией, хотя я установил, что это будет видно только после его построения.

Это то, что я вижу около второй: (Внутри мой фон рабочего стола)

before

, а затем я вижу информацию:

after

Почему это происходит, хотя я делаю все вычисления в конструкторе?

+2

Отправьте свой код здесь. Очевидно, что-то не так. – StanislavL

+0

Это около 500 строк кода .. есть ли какая-либо конкретная часть при назначении данных в JFrame, которые могут вызвать эту проблему? – Maroun

ответ

1

Похоже, вы выполнять блокирующий вызов, т. е. запрос базы данных, в потоке графического интерфейса синхронно. Вы должны делать такие вещи асинхронно, используя SwingWorker:

final JTextField field = new JTextField(); 
field.setEditable (false); 

JButton button = new JButton(new AbstractAction ("Calculate!") { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     field.setText ("Calculating..."); 

     new SwingWorker<String, String>() 
     { 
      @Override 
      protected String doInBackground() throws Exception { 
       Thread.sleep(3000L); 

       field.setText ("Calculated!"); 

       return null; 
      } 
     }.execute(); 
    } 
}); 

JFrame frame = new JFrame(); 
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
frame.getContentPane().setLayout (new BorderLayout()); 
frame.getContentPane().add (button, BorderLayout.NORTH); 
frame.getContentPane().add (field, BorderLayout.CENTER); 
frame.pack(); 
frame.setVisible (true); 
+3

-1 для доступа к полю в doInBackground (aka: off the EDT) – kleopatra

+0

@kleopatra Метод 'setText' является потокобезопасным. –

+0

нет, это не так - это никогда не было, хотя и документировано _incorrectly_ (читай: это ошибка документации!) Как таковая в более ранних версиях – kleopatra

5

Похоже, вы блокирование событий потока диспетчеризации (EDT)

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

Вы хотели бы взглянуть на Concurrency in Swing и, вероятно, Swing Worker

Одним из важных правил при работе с свинг и нитками, вы должны взаимодействовать только с компонентами Swing, внутри EDT

Смежные вопросы