как приостановить программу до нажатия кнопки? - PullRequest
4 голосов
/ 29 марта 2011

я использую из класса, который расширен от jframe и у него есть кнопка (я использую его в своей программе)

я хочу, чтобы при запуске jframe в моей программе вся моя программа делала паузу

пока я не нажму кнопку.

как я могу это сделать

в c ++ getch() сделать это.

Я хочу такую ​​функцию.

Ответы [ 6 ]

10 голосов
/ 29 марта 2011

Приостановка выполнения со сном , хотя я сомневаюсь, что это механизм, который вы захотите использовать.Так что, как и предполагали другие, я считаю, что вам нужно реализовать логику wait-notify.Вот чрезвычайно надуманный пример:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

@SuppressWarnings("serial")
public class PanelWithButton extends JPanel
{
    // Field members
    private AtomicBoolean paused;
    private JTextArea textArea;
    private JButton button;
    private Thread threadObject;

    /**
     * Constructor
     */
    public PanelWithButton()
    {
        paused = new AtomicBoolean(false);
        textArea = new JTextArea(5, 30);
        button = new JButton();

        initComponents();
    }

    /**
     * Initializes components
     */
    public void initComponents()
    {
        // Construct components
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);
        add( new JScrollPane(textArea));
        button.setPreferredSize(new Dimension(100, 100));
        button.setText("Pause");
        button.addActionListener(new ButtonListener());
        add(button);

        // Runnable that continually writes to text area
        Runnable runnable = new Runnable()
        {
            @Override
            public void run() 
            {
                while(true)
                {
                    for(int i = 0; i < Integer.MAX_VALUE; i++)
                    {
                        if(paused.get())
                        {
                            synchronized(threadObject)
                            {
                                // Pause
                                try 
                                {
                                    threadObject.wait();
                                } 
                                catch (InterruptedException e) 
                                {
                                }
                            }
                        }

                        // Write to text area
                        textArea.append(Integer.toString(i) + ", ");


                        // Sleep
                        try 
                        {
                            Thread.sleep(500);
                        } 
                        catch (InterruptedException e) 
                        {
                        }
                    }
                }
            }
        };
        threadObject = new Thread(runnable);
        threadObject.start();
    }

    @Override
    public Dimension getPreferredSize()
    {
        return new Dimension(400, 200);
    }

    /**
     * Button action listener
     * @author meherts
     *
     */
    class ButtonListener implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent evt) 
        {
            if(!paused.get())
            {
                button.setText("Start");
                paused.set(true);
            }
            else
            {
                button.setText("Pause");
                paused.set(false);

                // Resume
                synchronized(threadObject)
                {
                    threadObject.notify();
                }
            }
        }
    }
}

А вот ваш основной класс:

 import javax.swing.JFrame;
    import javax.swing.SwingUtilities;


    public class MainClass 
    {
        /**
         * Main method of this application
         */
        public static void main(final String[] arg)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new PanelWithButton());
                    frame.pack();
                    frame.setVisible(true);
                    frame.setLocationRelativeTo(null);
                }
            });
        }
    }

Как видите, это приложение-пример будет постоянно писатьдо текстовой области, пока вы не нажмете кнопку с надписью «Пауза», после чего для возобновления вам нужно будет нажать ту же кнопку, которая теперь будет читать «Пуск».

1 голос
/ 15 декабря 2012

попробуйте мою кнопку паузы Java:

package drawFramePackage;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.Timer;
public class Milliseconds2 implements ActionListener, MouseListener{
    JFrame j;
    Timer t;
    Integer onesAndZeros, time, time2, placeHolder2;
    Boolean hasFired;
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Milliseconds2();
    }
    public Milliseconds2(){
        j = new JFrame();
        j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        j.setSize(new Dimension(300, 300));
        j.setVisible(true);
        j.addMouseListener(this);
        onesAndZeros = new Integer(0);
        time = new Integer(0);
        time2 = new Integer(0);
        placeHolder2 = new Integer(0);
        hasFired = new Boolean(true);
        t = new Timer(2400, this);
        time = (int) System.currentTimeMillis();
        t.start();
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub
        if (onesAndZeros.equals(0)){
            t.stop();
            if (hasFired){
                time2 = t.getDelay() - ((int) System.currentTimeMillis() - time);
            }
            else{
                time2 -= (int) System.currentTimeMillis() - placeHolder2;
            }
            if (hasFired){
                hasFired = false;
            }
            onesAndZeros = -1;
        }
        if (onesAndZeros.equals(1)){
            //System.out.println(time2);
            t.setInitialDelay(time2);
            t.start();
            placeHolder2 = (int) System.currentTimeMillis();
            onesAndZeros = 0;
        }
        if (onesAndZeros.equals(-1)){
            onesAndZeros = 1;
        }
    }
    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        time = (int) System.currentTimeMillis();
        hasFired = true;
        System.out.println("Message");
    }
}
1 голос
/ 29 марта 2011

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

Сценарий паузы в цикле

 boolean paused;
 while(true ) {
   if(paused)
   {
     Thread.sleep(1000); // or do whatever you want in the paused state
   } else {
     doTask1
     doTask2
     doTask3
   }
 }

Потоки: Вы также можете поместить эти задачи в отдельный поток, а не в поток GUI, что обычно и делается долговыполнение операций.

Приостановка потока очень проста.Просто вызовите suspend () для этого.Если вы хотите сделать паузу, звоните возобновить ()Эти методы, однако, опасны и не рекомендуются.Лучший или, скорее, более безопасный способ сделать это был бы аналогичен приведенному выше, отметив флаг паузы. Вот короткий пример, который я лежал в своих отрывках.Не могу точно вспомнить, где я взял это в первую очередь:

// Create and start the thread
MyThread thread = new MyThread();
thread.start();

while (true) {
    // Do work

    // Pause the thread
    synchronized (thread) {
        thread.pleaseWait = true;
    }

    // Do work

    // Resume the thread
    synchronized (thread) {
        thread.pleaseWait = false;
        thread.notify();
    }

    // Do work
}

class MyThread extends Thread {
    boolean pleaseWait = false;

    // This method is called when the thread runs
    public void run() {
        while (true) {
            // Do work

            // Check if should wait
            synchronized (this) {
                while (pleaseWait) {
                    try {
                        wait();
                    } catch (Exception e) {
                    }
                }
            }

            // Do work
        }
    }
}    // Create and start the thread
MyThread thread = new MyThread();
thread.start();

while (true) {
    // Do work

    // Pause the thread
    synchronized (thread) {
        thread.pleaseWait = true;
    }

    // Do work

    // Resume the thread
    synchronized (thread) {
        thread.pleaseWait = false;
        thread.notify();
    }

    // Do work
}

class MyThread extends Thread {
    boolean pleaseWait = false;

    // This method is called when the thread runs
    public void run() {
        while (true) {
            // Do work

            // Check if should wait
            synchronized (this) {
                while (pleaseWait) {
                    try {
                        wait();
                    } catch (Exception e) {
                    }
                }
            }

            // Do work
        }
    }
}

Надеюсь, это поможет

0 голосов
/ 29 марта 2011

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

Если у вас есть кнопка в вашем пользовательском интерфейсе и вы хотите что-то запустить при нажатии этой кнопки, вы должны добавить объект ActionListener к вашей кнопке. После нажатия кнопки запускается объект ActionListener для выполнения задачи, например ::10000

button.addActionListener(new ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        // do something
    }
});

Если вы хотите что-то остановить при нажатии кнопки паузы, вам определенно понадобится Thread. Это сложнее, чем в первом случае.

0 голосов
/ 29 марта 2011

Вы не говорите, что вы подразумеваете под паузой.Что делает ваше приложение?

Как правило, вы НЕ МОЖЕТЕ приостановить работу приложения.Приложения пользовательского интерфейса запускаются из цикла обработки сообщений.Сообщение приходит, сообщение отправляется, цикл ожидает другого сообщения.Приложение по-прежнему должно обрабатывать такие вещи, как нажатие пользователем кнопок, изменение размера окна, закрытие приложения и т. Д., Чтобы этот цикл выполнялся непрерывно.

Если вы хотите, чтобы приложение «приостанавливало» в смысле предотвращенияпользователь делает что-то, просто выделите любую кнопку или меню, что вы не хотите, чтобы пользователи делали.

Если ваше приложение запускает поток в фоновом режиме и хочет, чтобы оно приостановило это действие, пока вы не возобновите его, вы можете сделать это довольно легко, как это.

MyThread mythread = new MyThread();

// Main thread
void pause() {
  mythread.pause = true;
}

void resume() {
  synchronized (mythread) {
    mythread.pause = false;
    mythread.notify();
  }
}


class MyThread extends Thread {
  public boolean pause = false;

  public void run() {
    while (someCondition) {
      synchronized (this) {
        if (pause) {
          wait();
        }
      }
      doSomething();
    }
  }
}

Это также возможноиспользовать Thread.suspend (), Thread.resume (), чтобы выполнить подобное, но это опасно, потому что вы не знаете, где находится поток, когда вы его приостанавливаете.Он может иметь открытый файл, быть посередине отправки сообщения через сокет и т. Д. Помещение теста в любой цикл, управляющий вашим потоком, позволяет вам приостановить работу в момент, когда это безопасно.

0 голосов
/ 29 марта 2011

Замораживание вашего основного потока эффективно заморозит всю программу и может привести к тому, что операционная система сочтет, что приложение завершилось сбоем, не совсем уверен, так что исправьте меня, если я ошибаюсь. Вы можете попытаться скрыть / отключить элементы управления и включить их снова, когда пользователь нажмет на вашу кнопку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...