2014-11-20 4 views
0

У меня есть простой вопрос, связанный с iPOJO.Сон с компонентом iPOJO, все отключены

Когда компонент iPOJO спит, все остальные компоненты также будут отключены, хотя между ними нет зависимостей. Зачем? Вот пример:

Компонент 1:

@Component(name="frame1", immediate=true) 
@Instantiate(name="iframe1") 
public class Frame1 implements Runnable{ 

    String str; 
    Label lb = new Label(); 
    TextField tf = new TextField(); 
    Frame fr; 
public void run() { 
    fr = new Frame("Frame1"); 
    fr.setLayout(new BorderLayout()); 
    fr.setSize(230, 200); 
    fr.setLocation(900,250); 
    fr.add(tf, BorderLayout.NORTH); 
    lb.setText("Result"); 
    fr.add(lb, BorderLayout.CENTER); 
    Panel pn = new Panel(); 
    fr.add(pn, BorderLayout.SOUTH); 
    pn.setLayout(new GridLayout(1,4,1,1)); 
    Button bt = new Button("Printer 1"); 
    pn.add(bt); 
    bt.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      try { 
       System.out.println("start sleep"); 
       Thread.sleep(5000); 
       System.out.println("stop sleep"); 
      } catch (InterruptedException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 

    }); 

    fr.setVisible(true); 
} 
@Validate 
public void start() { 
    //this.delayService = dls; 
    Thread th = new Thread(this); 
    th.start(); 
} 
@Invalidate 
public void stop() { 
    System.out.println("stop"); 
    fr.setVisible(false); 
} 
}  

Компонент 2:

@Component(name="frame2", immediate=true) 
@Instantiate(name="iframe2") 
public class Frame2 implements Runnable{ 

String str; 
Label lb = new Label(); 
TextField tf = new TextField(); 
Frame fr; 
public void run() { 
    System.out.println("start component 2"); 
    fr = new Frame("Frame2"); 
    fr.setLayout(new BorderLayout()); 
    fr.setSize(230, 200); 
    fr.setLocation(900,250); 
    fr.add(tf, BorderLayout.NORTH); 
    lb.setText("Result"); 
    fr.add(lb, BorderLayout.CENTER); 

    Panel pn = new Panel(); 
    fr.add(pn, BorderLayout.SOUTH); 
    pn.setLayout(new GridLayout(1,4,1,1)); 
    Button bt = new Button("Printer 2"); 
    pn.add(bt); 
    bt.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("in 2"); 
     } 
    }); 

    fr.setVisible(true); 
} 
@Validate 
public void start() throws Exception { 
    //this.delayService = dls; 
    System.out.println("start thread 2"); 
    Thread th = new Thread(this); 
    th.start(); 

    //fr.setVisible(true); 
} 
@Invalidate 
public void stop() throws Exception { 
    System.out.println("stop"); 
    fr.setVisible(false); 
} 
} 

двух компонентов развернуты и работает. Существует два независимых компонента. Но я нажимаю кнопку «Принтер 1». Компонент «frame1» спящий в течение 5 секунд. И за эти 5 секунд я не могу нажать «Принтер 2» компонента «frame2».

ответ

1

Это не проблема ipojo. Swing использует один поток (и только один поток), чтобы отправлять события, такие как клики. Когда вы нажимаете на свою первую кнопку, качание запускает ваш actionPerformed в этой теме. Этот метод заставляет ваш поток спать в течение 5 секунд. Это означает, что поток, ответственный за обработку событий, не может ничего сделать за это время. Вот почему ваша программа не реагирует на ваш второй клик.

Всякий раз, когда у вас есть длинное вычисление в качелях (и также osgi), часто рекомендуется запускать ваш код в отдельном потоке, чтобы избежать блокировки выполнения (здесь у вас есть бесполезный Thread.sleep(), но я думаю, вы может иметь HTTP-запрос или что-нибудь, что может занять много времени). Вероятно, вы должны использовать executor service или что-то подобное.

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