Ожидание нажатия кнопки в цикле for?

Я не уверен, как это обойти, но цель моего кода - перебирать CSV-файл, и пользователь ищет определенный элемент. Мои элементы читаются через массив строк списка типов с помощью CSVReader, так что это не проблема.

Когда пользователь ищет элемент, я создал цикл for для перебора строк и столбцов моего CSV-файла, и, как только он будет найден, будет выведен некоторый код.

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

Вот мой код:

    editTigerFrame obj = new editTigerFrame();

    String getLocation = obj.editLocationField.getText();
    javax.swing.JButton saveButt = obj.saveEditButton;


    try{

        String strSearch = searchSerialField.getText();

        CSVReader reader = new CSVReader(new FileReader("test.txt"), ',');
        List<String[]> myEntries = reader.readAll();
        reader.close();

        for (int row = 0; row < myEntries.size(); row++)
        {
            for (int column = 0; column < myEntries.get(row).length; column++)
            {
                if (myEntries.get(row)[column].trim().equalsIgnoreCase(strSearch))
                {
                        System.out.println("Found - Your item is on row: " + row + ", column: " + column);

                        //If serial is found, open the editTigerFrame to edit details
                        new editTigerFrame().setVisible(true);

                        //Replace with user input
                        //When button is pressed in other class, execute this code
                        System.out.println("Saved");
                        String newLocation = getLocation;

Как вы можете видеть в нижней части фрагмента кода, после нажатия кнопки в другой форме выполните код для изменения строки.

Есть ли способ сделать паузу и продолжить в цикле for?

Спасибо за вашу помощь, и если вам нужно что-то еще, пожалуйста, дайте мне знать, и я предоставлю.


person juiceb0xk    schedule 20.11.2016    source источник
comment
Использование общего flag как для цикла, так и для нажатия кнопки может быть удобным. Обновите flag в обработчике нажатия кнопки и используйте тот же flag в самом внутреннем цикле, где вы хотите break. Использование нового Thread сделает его эффективным.   -  person    schedule 21.11.2016


Ответы (2)


Есть ли способ сделать паузу и продолжить в цикле for?

Может быть, отобразить JOptionPane с запросом на использование ввода?

Ознакомьтесь с разделом руководства Swing по Как создавать диалоги для получения дополнительной информации и примеров.

Если вам нужно собрать более сложные данные, вы должны использовать модальный JDialog.

person camickr    schedule 20.11.2016
comment
Как только диалоговое окно открывается и запрашивает ввод данных пользователем, мне все равно нужно приостановить цикл for, иначе код будет продолжаться, как если бы я ничего не вводил в текстовое поле. - person juiceb0xk; 20.11.2016
comment
@ juiceb0xk, да, цикл приостанавливается, пока отображается JOptionPane/JDialog, и перезапускается, как только диалоговое окно закрывается. Поэтому вам нужно получить данные и обработать их, когда диалоговое окно закроется, прежде чем продолжить цикл. - person camickr; 20.11.2016

Вы можете выйти из цикла for с помощью break;. Запомните строку, столбец и т. д. перед тем, как уйти, и начните циклы с запомненными значениями.

Я думаю, что было бы неплохо поместить цикл for в отдельный метод. То же самое относится и к «всплывающему окну» для ввода. Тогда вы можете просто позвонить им, когда это необходимо. ^^-д

Изменить: пример кода:

        package pauseLoop;


public class pauseLoop {
        int rows;
        int columns;
        int something;
        static int[] a;

    public static void main(String[] gnarrr){
        pauseLoop myLoop = new pauseLoop();

        myLoop.Loop();

        myLoop.Loop();
    }

    public pauseLoop(){
        this.rows = 0;
        this.columns = 0;
        this.something = 11; //just random data
    }

    public void Loop(){
        System.out.println("starting loop with: rows = " + rows + " columns = " + columns + " something = " + something);

        for(int count = rows; count < 99999 ;count++){
            /* do some black magic ;) */

            if(count % 23 == 22){ // !condition to pause the loop! i chose something that can occur more than once
                this.rows += count; //remember rows
                this.columns += 5; // columns got 5 more by some black magic (nested loop or so)
                this.something += 31; //just some data needed to be remembered for later
                System.out.println("leaving loop with: rows = " + rows + " columns = " + columns + " something = " + something+ "\n");
                break; //leave loop!
            }
        }
    }

}

При запуске выдает следующий вывод:

начальный цикл: строки = 0 столбцы = 0 что-то = 11

выход из цикла с: ряды = 22 столбцы = 5 что-то = 42

начальная петля с: ряды = 22 столбцы = 5 что-то = 42

выходной цикл с: строки = 44 столбцы = 10 что-то = 73

Удачного кодирования!

person Lord_PedantenStein    schedule 20.11.2016
comment
Как я могу перезапустить цикл с запомненными значениями? - person juiceb0xk; 20.11.2016
comment
@ juiceb0xk скорректировал код так, чтобы цикл действительно возобновлялся со строками - принцип остается таким же жестким ^^ - person Lord_PedantenStein; 21.11.2016