第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過按鍵和釋放使循環(huán)開始和結束?

如何通過按鍵和釋放使循環(huán)開始和結束?

森林海 2021-07-08 18:41:47
這是我的代碼......我怎樣才能讓它工作,以便在用戶按住按鈕時運行循環(huán)并在用戶釋放按鈕時停止?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;    }}
查看完整描述

2 回答

?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

所以,答案是——這很復雜。它涵蓋了廣泛的主題,例如并發(fā)(一般)、GUI 開發(fā)、特定 API (Swing) 的最佳實踐

該示例提供了兩種執(zhí)行“循環(huán)”的doInBackground方法(在CalculateWorker類的方法中提供)。


您可以按住JButton或按住 [kbd]Space[kbd] 欄,兩者都會導致“主循環(huán)”運行,更新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 {


    public static void main(String[] args) {

        new Test();

    }


    public Test() {

        EventQueue.invokeLater(new Runnable() {

            @Override

            public void run() {

                try {

                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {

                    ex.printStackTrace();

                }


                JFrame frame = new JFrame("Testing");

                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                frame.add(new TestPane());

                frame.pack();

                frame.setLocationRelativeTo(null);

                frame.setVisible(true);

            }

        });

    }


    public class TestPane extends JPanel {


        private JTextArea ta;

        private CalculateWorker worker;


        public TestPane() {

            setLayout(new BorderLayout());


            ta = new JTextArea(20, 20);

            ta.setEditable(false);

            add(new JScrollPane(ta));


            worker = new CalculateWorker(ta);


            JButton btn = new JButton("Press");

            btn.getModel().addChangeListener(new ChangeListener() {

                @Override

                public void stateChanged(ChangeEvent e) {

                    System.out.println("...isRunning = " + worker.isRunning());

                    if (!worker.isRunning()) {

                        return;

                    }

                    System.out.println("...isPressed = " + btn.getModel().isPressed());

                    System.out.println("...isPaused = " + worker.isPaused());

                    if (btn.getModel().isPressed()) {

                        worker.pause(false);

                    } else {

                        worker.pause(true);

                    }

                }

            });


            add(btn, BorderLayout.SOUTH);

            worker.execute();


            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);

            ActionMap am = getActionMap();


            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, false), "Space.released");

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true), "Space.pressed");


            am.put("Space.released", new CalculateAction(false, worker));

            am.put("Space.pressed", new CalculateAction(true, worker));

        }


        public class CalculateWorker extends SwingWorker<List<String>, String> {


            private AtomicBoolean run = new AtomicBoolean(true);

            private AtomicBoolean paused = new AtomicBoolean(false);


            private ReentrantLock pausedLocked = new ReentrantLock();

            private Condition pausedCondition = pausedLocked.newCondition();


            private JTextArea ta;


            public CalculateWorker(JTextArea ta) {

                this.ta = ta;

                pause(true);

            }


            public void stop() {

                run.set(false);

                pausedLocked.lock();

                pausedCondition.signalAll();

                pausedLocked.unlock();

            }


            public void pause(boolean pause) {

                paused.set(pause);

                pausedLocked.lock();

                pausedCondition.signalAll();

                pausedLocked.unlock();

            }


            public boolean isPaused() {

                return paused.get();

            }


            public boolean isRunning() {

                return run.get();

            }


            @Override

            protected List<String> doInBackground() throws Exception {

                List<String> values = new ArrayList<>(256);

                long value = 0;

                System.out.println("!! Start running");

                while (run.get()) {

                    while (paused.get()) {

                        System.out.println("!! I'm paused");

                        pausedLocked.lock();

                        try {

                            pausedCondition.await();

                        } finally {

                            pausedLocked.unlock();

                        }

                    }

                    System.out.println("!! Start loop");

                    while (!paused.get() && run.get()) {

                        value++;

                        values.add(Long.toString(value));

                        publish(Long.toString(value));

                        Thread.sleep(5);

                    }

                    System.out.println("!! Main loop over");

                }

                System.out.println("!! Run is over");

                return values;

            }


            @Override

            protected void process(List<String> chunks) {

                for (String value : chunks) {

                    ta.append(value);

                    ta.append("\n");

                }

                ta.setCaretPosition(ta.getText().length());

            }


        }


        public class CalculateAction extends AbstractAction {


            private boolean start;

            private CalculateWorker worker;


            public CalculateAction(boolean start, CalculateWorker worker) {

                putValue(NAME, "Calculate");

                this.start = start;

                this.worker = worker;

            }


            @Override

            public void actionPerformed(ActionEvent e) {

                worker.pause(start);

            }


        }


    }


}

有沒有更簡單的解決方案?


當然,我總是先找最難、最難理解的解決方案(諷刺)


雖然“可能”降低復雜性是可能的,但該示例提供了許多“最佳實踐”概念,您可以很好地學習和理解這些概念。


該解決方案也可以根據(jù)所使用的 API 以不同方式完成,因此,它是特定 API 選擇的“最簡單”解決方案。


我想從控制臺做到這一點!


Java 不能這樣做 - 它的控制臺支持充其量只是基本的,并且不支持“按鍵按下/釋放”操作的概念(因為它在單個線程中運行,否則它不可能這樣做)。


您可能會嘗試“有”解決方案,但它們需要鏈接到本機二進制文件的第三方庫才能實現(xiàn),這(可能)會減少它運行的平臺數(shù)量


查看完整回答
反對 回復 2021-07-14
  • 2 回答
  • 0 關注
  • 209 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號