Опубликован: 13.07.2012 | Доступ: свободный | Студентов: 460 / 8 | Оценка: 5.00 / 5.00 | Длительность: 18:06:00
Специальности: Программист
Лекция 8:

Ввод и отображение текстовой информации

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >

Переключение режимов редактирования реализовано в методе нашего класса компонента содержимого buttonClicked ( пример 8.7)

  else if(pButton == pReadOnlyButton)
  {
    pLabel->setEditable(false, false, false);
  }
  else if(pButton == pEditByOneClickButton)
  {
    pLabel->setEditable(true, false, false);
  }
  else if(pButton == pEditByDoubleClickButton)
  {
    pLabel->setEditable(false, true, false);
  }
Листинг 8.7. Часть реализации метода buttonClicked класса TCentralComponent (файл TCentralComponent.cpp)

И наконец рассмотрим использование объекта класса TextEditor в качестве поля ввода пароля. Это сделано в третей секции нашей демонстрационной программы ( рис. 8.1). Сделаем строку String sPassword закрытым членом нашего класса TCentralComponent. Она будет отвечать за хранение строки — пароля. Строка будет сравниваться с текстом, вводимым пользователем в поле TextEditor* pPasswordEdit. Сравнение будет осуществляться по щелчку кнопки TextButton* pSubmitButton ( пример 8.8).

pPasswordLabel = new Label("PasswordLabel", tr("Введите пароль: "));
  pPasswordLabel->setEditable(false, false, false);
  addAndMakeVisible(pPasswordLabel);

  // Поле ввода пароля
  pPasswordEdit = new TextEditor("PasswordEdit", 0x2022);
  // Разрешаем ввод цифр; ограничений на длину вводимой строки нет
  pPasswordEdit->setInputRestrictions(0, "1234567890");
  pPasswordEdit->setMultiLine(false);
  pPasswordEdit->setScrollbarsShown(false);
  pPasswordEdit->setReturnKeyStartsNewLine(false);
  pPasswordEdit->addKeyListener(this);
  addAndMakeVisible(pPasswordEdit);

  // Кнопка ввода пароля
  pSubmitButton = new TextButton("SubmitButton");
  pSubmitButton->setButtonText(tr("Ввод"));
  pSubmitButton->addListener(this);
  addAndMakeVisible(pSubmitButton);

  setSize(728, 400);

  // Задаём пароль
  sPassword = "1234";
Листинг 8.8. Часть реализации конструктора класса TCentralComponent (3-я секция демонстрационной программы ввода и отображения текстовой информации, файл TCentralComponent.cpp)

Числовой код 0x2022 замещающего символа пароля, передаваемый в качестве второго параметра в конструктор виджета pPasswordEdit ( пример 8.8), выбран не случайно. Это код символа так называемой пули или дробины (bullet), которая одинаково отображается как в Linux, так и в Windows.

Проверку корректности введённого пароля реализуем в виде отдельной функции-члена класса TCentralComponent ( пример 8.9).

void TCentralComponent::SubmitPassword()
{
  // Если введённый текст не содержит пустую строку
  // или строку, заполненную пробелами
  if(pPasswordEdit->getText().containsNonWhitespaceChars())
  {
    // И если пароль соответствует введённому тексту
    if(pPasswordEdit->getText() == sPassword)
    {
      // Выводим информационное сообщение
      pPasswordLabel->setColour(Label::textColourId, Colours::blue);
      pPasswordLabel->setText(tr("Принято!"), false);
      // Делаем недоступными кнопку и поле ввода
      pPasswordEdit->setEnabled(false);
      pSubmitButton->setEnabled(false);
    }
    else
    {
      pPasswordLabel->setColour(Label::textColourId, Colours::red);
      pPasswordLabel->setText(tr(
            "Пароль неверен! Введите повторно:"), false);
      pPasswordEdit->clear();
    }
  }
}
Листинг 8.9. Реализация проверки пароля (файл TCentralComponent.cpp)

В этом примере мы вначале проверяем не является ли введённый пользователем текст пустой (в том числе заполненной одними пробелами) строкой. Собственно, эта проверка является излишней, мы, посредством функции setInputRestrictions (см. листинг 8.8 ) задали набор символов, разрешённых к вводу, где нет пароля, так что можно было бы ограничиться проверкой

if(pPasswordEdit->getText() != String::empty

Метод containsNonWhitespaceChars был использован исключительно в качестве демонстрации.

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

Теперь остаётся только вызвать функцию SubmitPassword в обработчике событий нажатия на кнопку нашего компонента содержимого ( пример 8.10).

  else if(pButton == pSubmitButton)
  {
    SubmitPassword();
  }
Листинг 8.10. Часть реализации метода buttonClicked класса TCentralComponent (файл TCentralComponent.cpp)

Многие пользователи, в том числе и автор этой лекции, предпочитают по завершении ввода пароля не щёлкать мышью по кнопке, а нажимать клавишу <ENTER> для ввода. Реализуем эту возможность в нашей программе (рассмотрен лишь один из возможных способов). Для того, чтобы наш компонент содержимого мог отслеживать нажатия клавиш клавиатуры пользователем, унаследуем его класс от слушателя клавиш KeyListener ( пример 8.11).

class TCentralComponent  : public Component,
           public ComboBoxListener,
           public ButtonListener,
           public KeyListener // слушатель клавиш
Листинг 8.11. Часть объявления конструктора класса TCentralComponent (файл TCentralComponent.h)

Напишем реализацию чистой виртуальной функции-члена класса слушателя virtual bool KeyListener::keyPressed(const KeyPress& key, Component* originatingComponent) пример 8.12.

bool TCentralComponent::keyPressed(const KeyPress& Key, 
                  Component* pComponent)
{
  // Если в фокусе другое поле ввода - выходим
  if(pComponent != pPasswordEdit) return false;
  // Если нажата не клавиша <ENTER> - выходим
  else if(Key != KeyPress::returnKey) return false;
  else SubmitPassword();
  return true;
}
Листинг 8.12. Реализация метода отслеживания нажатия клавиш клавиатуры (файл TCentralComponent.cpp)

Запустим откомпилированную демонстрационную программу и убедимся, что ввод пароля осуществляется как при щелчке по кнопке, так и при нажатии клавиши <ENTER>.

Краткие итоги

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

Упражнение

Напишите простейший текстовый редактор с возможностью автоматического переноса строк при достижении границы поля ввода. Предусмотрите возможность изменения параметров шрифта вводимого текста (с помощью кнопок).

Дополнительные материал

Архив с исходными текстами примера Вы можете скачать здесь

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >