如何通过按键和释放使循环开始和结束?

这是我的代码......我怎样才能让它工作,以便在用户按住按钮时运行循环并在用户释放按钮时停止?


public void nextPrimeNum()

{

    x = false;

    int b = 2;

    ArrayList<Integer> next = new ArrayList<Integer>();   

    while(x)

    {

        next = factors(b);

        if(next.size()==2)

        {

            System.out.println(b);

        }

        b++;

    }

    System.out.println("End");

}

public void keyPressed(KeyEvent e)

{

    if(e.getKeyCode() == 401)

    {

        x = true;

    }

}

public void keyRealesed(KeyEvent e)

{

    if(e.getKeyCode() == 402)

    {

        x = false;

    }

}


森林海
浏览 203回答 2
2回答

慕哥6287543

所以,答案是——这很复杂。它涵盖了广泛的主题,例如并发(一般)、GUI 开发、特定 API (Swing) 的最佳实践该示例提供了两种执行“循环”的doInBackground方法(在CalculateWorker类的方法中提供)。您可以按住JButton或按住 [kbd]Space[kbd] 栏,两者都会导致“主循环”运行,更新JTextArea结果...import java.awt.BorderLayout;import java.awt.EventQueue;import java.awt.event.ActionEvent;import java.awt.event.KeyEvent;import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicBoolean;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;import javax.swing.AbstractAction;import javax.swing.ActionMap;import javax.swing.InputMap;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.KeyStroke;import javax.swing.SwingWorker;import javax.swing.UIManager;import javax.swing.UnsupportedLookAndFeelException;import javax.swing.event.ChangeEvent;import javax.swing.event.ChangeListener;public class Test {&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; new Test();&nbsp; &nbsp; }&nbsp; &nbsp; public Test() {&nbsp; &nbsp; &nbsp; &nbsp; EventQueue.invokeLater(new Runnable() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ex.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; JFrame frame = new JFrame("Testing");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; frame.add(new TestPane());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; frame.pack();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; frame.setLocationRelativeTo(null);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; frame.setVisible(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }&nbsp; &nbsp; public class TestPane extends JPanel {&nbsp; &nbsp; &nbsp; &nbsp; private JTextArea ta;&nbsp; &nbsp; &nbsp; &nbsp; private CalculateWorker worker;&nbsp; &nbsp; &nbsp; &nbsp; public TestPane() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setLayout(new BorderLayout());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ta = new JTextArea(20, 20);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ta.setEditable(false);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; add(new JScrollPane(ta));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; worker = new CalculateWorker(ta);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; JButton btn = new JButton("Press");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; btn.getModel().addChangeListener(new ChangeListener() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void stateChanged(ChangeEvent e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("...isRunning = " + worker.isRunning());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!worker.isRunning()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("...isPressed = " + btn.getModel().isPressed());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("...isPaused = " + worker.isPaused());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (btn.getModel().isPressed()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; worker.pause(false);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; worker.pause(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; add(btn, BorderLayout.SOUTH);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; worker.execute();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ActionMap am = getActionMap();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, false), "Space.released");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true), "Space.pressed");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; am.put("Space.released", new CalculateAction(false, worker));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; am.put("Space.pressed", new CalculateAction(true, worker));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public class CalculateWorker extends SwingWorker<List<String>, String> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private AtomicBoolean run = new AtomicBoolean(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private AtomicBoolean paused = new AtomicBoolean(false);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private ReentrantLock pausedLocked = new ReentrantLock();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private Condition pausedCondition = pausedLocked.newCondition();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private JTextArea ta;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public CalculateWorker(JTextArea ta) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.ta = ta;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pause(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void stop() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; run.set(false);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pausedLocked.lock();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pausedCondition.signalAll();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pausedLocked.unlock();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void pause(boolean pause) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; paused.set(pause);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pausedLocked.lock();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pausedCondition.signalAll();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pausedLocked.unlock();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public boolean isPaused() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return paused.get();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public boolean isRunning() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return run.get();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; protected List<String> doInBackground() throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<String> values = new ArrayList<>(256);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long value = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("!! Start running");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (run.get()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (paused.get()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("!! I'm paused");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pausedLocked.lock();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pausedCondition.await();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } finally {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pausedLocked.unlock();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("!! Start loop");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (!paused.get() && run.get()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values.add(Long.toString(value));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; publish(Long.toString(value));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread.sleep(5);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("!! Main loop over");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("!! Run is over");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return values;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; protected void process(List<String> chunks) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (String value : chunks) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ta.append(value);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ta.append("\n");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ta.setCaretPosition(ta.getText().length());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public class CalculateAction extends AbstractAction {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private boolean start;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private CalculateWorker worker;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public CalculateAction(boolean start, CalculateWorker worker) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; putValue(NAME, "Calculate");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.start = start;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.worker = worker;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void actionPerformed(ActionEvent e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; worker.pause(start);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}有没有更简单的解决方案?当然,我总是先找最难、最难理解的解决方案(讽刺)虽然“可能”降低复杂性是可能的,但该示例提供了许多“最佳实践”概念,您可以很好地学习和理解这些概念。该解决方案也可以根据所使用的 API 以不同方式完成,因此,它是特定 API 选择的“最简单”解决方案。我想从控制台做到这一点!Java 不能这样做 - 它的控制台支持充其量只是基本的,并且不支持“按键按下/释放”操作的概念(因为它在单个线程中运行,否则它不可能这样做)。您可能会尝试“有”解决方案,但它们需要链接到本机二进制文件的第三方库才能实现,这(可能)会减少它运行的平台数量
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java