Индикатор выполнения командной строки в Java

В своем вопросе вы пишете «WPF», но ваш скриншот явно является приложением Windows Forms, поэтому я предоставлю ответ для Windows Forms. Тем не менее, он может быть легко изменен для работы с WPF.

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

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

private void UpdateVisualState()
{
    var ipString = $"{textBox1.Text}.{textBox2.Text}.{textBox3.Text}.{textBox4.Text}";
    infoTextBox.Text = IPAddress.TryParse(ipString, out var address)
        ? address.ToString()
        : "(Invalid IP address)";
}

Этот метод возьмет текст из textBox1 - textBox4, создаст из него IP-адрес, проанализирует этот IP-адрес и обновит infoTextBox либо проанализированным IP-адресом, либо текстом, который указывает, что IP-адрес недействителен.

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

private void textBox1_TextChanged(object sender, EventArgs e)
{
    UpdateVisualState();
}

То же самое для оставшихся трех текстовых полей с IP-адресом. октетов.

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

Чтобы узнать о более продвинутых способах проверки, вы можете прочитать Проверка ввода пользователя в Windows Forms .

121
задан dimo414 13 June 2015 в 17:20
поделиться

4 ответа

Я уже реализовывал подобные вещи раньше. Дело не столько в java, сколько в том, какие символы отправлять в консоль.

Ключевым моментом является разница между \ n и \ r . \ n переходит в начало новой строки. Но \ r - это просто возврат каретки - он возвращается в начало той же строки.

Итак, вам нужно распечатать индикатор выполнения, например, печать строки

"|========        |\r"

На следующем тике индикатора выполнения замените ту же строку более длинной полосой. (поскольку мы используем \ r, мы остаемся в той же строке) Например:

"|=========       |\r"

Что вы должны помнить, когда закончите, если вы затем просто напечатаете

"done!\n"

У вас все еще может быть мусор из-за прогресса бар на линии. Поэтому после того, как вы закончите с индикатором выполнения, обязательно напечатайте достаточно пробелов, чтобы удалить его из строки. Например:

"done             |\n"

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

166
ответ дан 24 November 2019 в 01:31
поделиться

Пример C #, но я предполагаю, что это то же самое для System.out.print в Java. Не стесняйтесь поправлять меня, если я ошибаюсь.

По сути, вы хотите написать escape-символ \ r в начале вашего сообщения что приведет к тому, что курсор вернется в начало строки (перевод строки) без перехода к следующей строке.

    static string DisplayBar(int i)
    {
        StringBuilder sb = new StringBuilder();

        int x = i / 2;
        sb.Append("|");
        for (int k = 0; k < 50; k++)
            sb.AppendFormat("{0}", ((x <= k) ? " " : "="));
        sb.Append("|");

        return sb.ToString();
    }

    static void Main(string[] args)
    {
        for (int i = 0; i <= 100; i++)
        {
            System.Threading.Thread.Sleep(200);
            Console.Write("\r{0} {1}% Done", DisplayBar(i), i);
        }

        Console.ReadLine();

    }
5
ответ дан 24 November 2019 в 01:31
поделиться

Это возможно с помощью библиотеки Java Curses. Это то, что я нашел. Сам я им не пользовался и не знаю, кроссплатформенный ли он.

2
ответ дан 24 November 2019 в 01:31
поделиться

Я обнаружил, что следующий код работает правильно. Он записывает байты в выходной буфер. Возможно, эти методы, использующие писатель, например метод System.out.println () , заменяют вхождения \ r на \ n , чтобы соответствовать окончанию родной строки цели (если не настроен должным образом).

public class Main{
    public static void main(String[] arg) throws Exception {
        String anim= "|/-\\";
        for (int x =0 ; x < 100 ; x++) {
            String data = "\r" + anim.charAt(x % anim.length()) + " " + x;
            System.out.write(data.getBytes());
            Thread.sleep(100);
        }
    }
}
23
ответ дан 24 November 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: