2012-11-28 4 views
0

У меня проблема с SWING GUI или, по крайней мере, я думаю, что это качели gui.JAVA Swing Gui Window Hangs

Вот мой основной код файла:

/** 
* 
*/ 
package com.tda.t2.ctas.slasher; 

import javax.swing.SwingUtilities; 

import com.tda.t2.ctas.slasher.gui.mainFrame; 
import com.tda.t2.ctas.slasher.utils.MyCloseListener; 



public class SLASHer { 

    public SLASHer() { 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     //EventQueue.invokeLater(new Runnable() { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       ConfigData myconfig = new ConfigData(); 
       try { 
        //TdaUrlHelper window = new TdaUrlHelper(); 
        //window.tdaFrame.setVisible(true); 
        mainFrame tdaFrame = new mainFrame(); 
        tdaFrame.setVisible(true); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

} 

Простой вызов, чтобы создать рамку и открыть его. Есть другие файлы, которые я не помещал здесь для свободного места. Но проблема, которую я имею (и я пробовал на нескольких машинах и операционных системах), состоит в том, что кнопки в окне, кажется, висеть. Я могу выбрать окно и нажать на кнопки, и они выделяются так, как будто они были удалены, но ничего не происходит. У меня есть панель с вкладками, и щелчок на других вкладках тоже ничего не делает. Несколько раз это длится около 15 секунд, а иногда это длится несколько минут. Но он всегда в конце концов возвращается и будет реагировать на новый вход (т. Е. Он не запоминает всех щелчков, которые я сделал до того, как он вернулся). Приложение в целом прост в том, что он сидит, ожидая, пока пользователь что-то сделает, прежде чем что-то сделает, поэтому я смущен тем, почему он, кажется, виснет.

Любая помощь будет оценена по достоинству.

Благодаря

+2

Ваша проблема в коде не показана. Вероятно, вы не подчиняетесь правилам Swing для правильной работы в ActionListeners для своих JButtons, но кто знает, пока мы не увидим оскорбительный код. –

+0

Похоже, что либо поток GUI печатает трассировку стека (: \.), Либо вы неправильно произвели многопоточность. –

+2

Обратите внимание, что класс mainFrame должен быть переименован в MainFrame. Все имена классов должны начинаться с буквы верхнего регистра. Это важно, если вы хотите, чтобы другие (как мы!) Могли понять ваш код и помочь вам. –

ответ

1

Что такое код обижая прикрепить к кнопке, которая висит? Проверьте консоль на наличие исключений и поместите некоторые инструкции System.out.println() вверху и внизу этого кода. Посмотрите, видите ли вы распечатываемые распечатки. Посмотрите, сколько времени потребуется для печати сверху, а снизу - для печати. Если вы видите оба утверждения, то вы знаете, что весь блок выполняется, но если потребуется какое-то время, чтобы показать последнее заявление, которое, как вы знаете, вы повесили поток Swing (также известный как EDT - поток отправки событий). Правило номер один в Swing пользовательского интерфейса не может перерисовать, когда он выполняет ваш ActionListener.

Чтобы сделать отзывчивый пользовательский интерфейс, вы должны увидеть первое и последнее заявление на консоли в течение 10-100 мсек (визуально почти мгновенно). Если вы действительно хотите получить фантазию, вы можете использовать System.currentTimeMillis() на стоп и дно. Вычтите два значения и println(). Это скажет вам, как долго длился этот слушатель. Если это больше 100 мс, вам необходимо реструктурировать свой код, либо улучшив алгоритм, либо не загружая длинный расчет по потоку (см. Это SwingWorker tutorial).

public void actionPerformed(ActionEvent event) { 
    System.out.println("Starting SomeProcess"); 
    long start = System.currentTimeMillis(); 

    // all your code belongs here 

    long duration = System.currentTimeMillis() - start; 
    System.out.printf("SomeProcess took %,d ms%n", duration); 
} 
+0

Я не добавил код кнопки, потому что на панели имеется 81 кнопка. И на этом, не важно, какую кнопку я ударил. Когда он висит, все кнопки не работают до тех пор, пока они не будут отцеплены. Это почти похоже на то, что он не понимал, что сейчас у него есть фокус, и именно поэтому я опубликовал то, что сделал. –

+1

Ну, это зависит от вас, какая помощь вам нужна. Вы можете сделать то, что я предлагаю, и разобраться в специфике вашей проблемы самостоятельно, или просто отправить код для одной из кнопок, которая висит в пользовательском интерфейсе. Вы правы, я не буду смотреть через 81 слушателя кнопок, но я посмотрю на прослушиватель 1 кнопки. Я думаю, что если вы сделаете то, что я предложил, вы поймете, в чем проблема. Если вы не можете понять это, добавьте еще какой-нибудь код. – chubbsondubs

+0

Согласен. По какой-то причине @JesterHawk, похоже, не хочет публиковать какой-либо код слушателя. Пока он это делает, все, что мы можем сделать, это то, что происходит. Вероятно, достаточно одного слушателя. –