Как остановить или спать Тема с кнопкой из другого класса

1

Допустим, я создал нить с кнопкой в twitterpanel class например

public class twitterpanel extends javax.swing.JFrame {
Thread oto;
/....
 private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { 
        oto = new Thread(new Runnable() {

        @Override
        public void run() {
            ArrayList<String> textler = new ArrayList<String>();
            textler.add(jTextField1.getText());
            textler.add(jTextField2.getText())

            new Twitter(textler);

        }
    });
    oto.start();
} }

Метод, например:

  public void twittermethod() { 
   for (;;) {
    System.out.println("Close me please..");
   }

  }

И я хочу закрыть эту тему с помощью другой кнопки, и кнопка находится в twitterpanel class. Может быть, это просто, но я ничего не мог найти, например, мой мозг остановился. Надеюсь, я могу ясно объяснить себя. Заранее спасибо..

  • 1
    Поскольку обе кнопки находятся в одном классе, просто сделайте oto переменную класса.
  • 0
    Спасибо за ответ, если не возражаете, приведите пример?
Показать ещё 2 комментария
Теги:
multithreading
swing
concurrency

2 ответа

3
Лучший ответ

Опять же, как указано в предыдущем удаленном вопросе,

  1. Ваш код не является потокобезопасным, поскольку вы вызываете вызовы Swing, которые изменяют состояние компонентов Swing из потока событий Swing.
  2. Ваш вопрос - проблема XY в том, что вы спрашиваете о конкретных решениях кода, которые могут быть неправильными, и вы не обсуждали свою цель.

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

Например, вы можете часто запускать и останавливать Threads с фоновым потоком SwingWorker. Подробнее о том, как использовать этот инструмент, читайте в учебнике SwingWorker, с которым я связан выше, и который вы можете найти здесь.

Пример минимальной программы Swing с SwingWorker, которая делает то, что вы пытаетесь сделать (я думаю!):

import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class StopThreadGui extends JPanel {
   private JTextField field1 = new JTextField("Hello", 10);
   private JTextField field2 = new JTextField("Goodbye", 10);
   private JButton startButton = new JButton(new StartAction("Start", KeyEvent.VK_S));
   private JButton endButton = new JButton(new EndAction("End", KeyEvent.VK_E));
   private MySwingWorker myWorker;

   public StopThreadGui() {
      add(field1);
      add(field2);
      add(startButton);
      add(endButton);
   }

   private static void createAndShowGui() {
      StopThreadGui mainPanel = new StopThreadGui();

      JFrame frame = new JFrame("StopThreadGui");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }

   private class StartAction extends AbstractAction {
      public StartAction(String name, int mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent evt) {
         if (myWorker != null && !myWorker.isDone()) {
            return;
         }
         String text1 = field1.getText();
         String text2 = field2.getText();

         myWorker = new MySwingWorker(text1, text2);
         myWorker.execute();
      }
   }

   private class EndAction extends AbstractAction {
      public EndAction(String name, int mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent evt) {
         if (myWorker == null || myWorker.isDone()) {
            return;
         }
         myWorker.cancel(true);
      }
   }

}

class MySwingWorker extends SwingWorker<Void, Void> {
   private static final long SLEEP_TIME = 400;
   private String text1;
   private String text2;

   public MySwingWorker(String text1, String text2) {
      this.text1 = text1;
      this.text2 = text2;
   }

   @Override
   protected Void doInBackground() throws Exception {
      boolean foo = true;
      while (foo) {
         System.out.printf("Text1: %s;   Text2: %s%n", text1, text2);
         System.out.println("Close me please..");
         Thread.sleep(SLEEP_TIME);
      }
      return null;
   }
}
  • 0
    Просто вопрос, хотя и не связанный, как можно увидеть ранее удаленные вопросы? Только доверенные пользователи, такие как вы, или недоверенные пользователи, такие как я, тоже могут найти их на сайте !!! Мне очень понравилось читать эту XY-проблему задолго до того, из одного из ваших постов.
  • 0
    спасибо за ваш ответ. Работник свингера. Я понял, что это как Android doingBackground() , onPreExecute() , OnPostExecute() . но для меня ваш пример сложный, потому что я новичок в Java. Но теперь я сначала посмотрю на SwingWorker ... а затем попытаюсь понять ваш пример. еще раз спасибо
Показать ещё 1 комментарий
3

Используйте Swing Timer, который наиболее подходит для качания приложений двумя способами:

  • Выполнение задачи один раз, после задержки.
  • Повторное выполнение задачи.

Подробнее о том, как использовать качающиеся таймеры

Просто вызовите timer#start() и timer#stop()

Образец кода:

// wait for 2 seconds
Timer timer=new Timer(2000,new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
       // do your action here
    }
});
timer.setRepeats(false); // if needed then repeat it
timer.start();

Прочитайте больше...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню