Спящий компонент 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».


person HNT    schedule 20.11.2014    source источник


Ответы (1)


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

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

person archz    schedule 20.11.2014