2015-07-23 4 views
0

Я приближаюсь к заполнению текстового поля для моего текстового редактора кроме выбора и нескольких ошибок с текстовым курсором. Я должен реализовать его с нуля, потому что другие библиотеки не соответствуют потребностям дизайна для моего редактора. Каждый раз, когда пользователь завершает линию и начинает обратную позицию на следующей строке, курсор и текст не будут правильно размещены, когда пользователь начнет вводить текст (курсор не находится на правой линии). Разрыв становится еще более значительным, когда пользователь держит это снова и снова.Обработка Java: позиция курсора текстового поля выключена

enter image description here

Вы можете ясно видеть, что курсор (светло-голубой) и текст не выровнены должным образом. Я прикрепил код, относящийся только к этой проблеме. Извините, если текстовое поле не находится в оптимальном положении, так как я перенес код из текстового редактора в деградированную версию для этой проблемы.

То, что я считаю виновным: Через пару часов я обнаружил, что позиция курсора зависит от строки и столбца (как указано на ярлыках). Я не прикреплял метки к примеру в Эта проблема. Линия показывает 2, но она должна быть 1. Когда столбец равен 1, а промежутки времени пользователя, линия должна уменьшаться на 1, а столбец - на длину предыдущей строки.

Если у вас есть вопросы, я был бы более чем счастлив ответить на них. Поскольку код был сложным для передачи, многие из них не будут работать должным образом (с курсором перемещаются по горизонтали, так как пользователь вводит), но я думаю, что это достаточно хорошо, чтобы решить проблему.

Как добраться проблемы:

  1. Введите текст в первой строке
  2. Hit введите
  3. Try реверс

Вот текст код коробки в Обработка Java:

// Content 
String content = ""; 
String[] adjustedLines = { 
}; 

// Current position 
int row = 1; 
int line = 1; 
int column = 1; 

// Cursor length 
float cursorLength = 12; 

// Whether line has been subtracted and readjustment to text has been completed 
boolean lineSubtracted = false; 

// Positions of scrollbar 
float cursorX = width/5 + 55; 
float cursorY = 55; 

void setup() 
{ 
    // Background and size 
    background(0); 
    size(1500, 700); 
} 

// Create set of line numbers given starting number and number of lines 
void createLineNumbers(int startingNumber, int numberOfLines) 
{ 
    textAlign(LEFT); 
    String lineText = ""; 
    textLeading(22); 

    for (int i = startingNumber; i <= startingNumber + numberOfLines; i++) 
    { 
    lineText += (str(i) + "\n"); 
    } 

    fill(200); 
    text(lineText, width/5 + 12.5, 75); 
    textAlign(CENTER); 
} 

void draw() 
{ 
    background(0); 

    // Update cursor position 
    cursorX = width/5 + 55; 
    cursorY = 55; 

    textAlign(CENTER); 

    // Text Box 
    fill(80); 
    rect(width/5, 55, width*4/5, height-55); 

    textAlign(LEFT); 
    textLeading(22); 
    fill(255); 

    String[] contentLines = content.split("\n"); 
    String display = ""; 
    int lineDifference = 0; 

    display = content; 
    text(display, width/5+55, 75); 

    // Line Numbers 
    textAlign(CENTER); 
    fill(240); 

    createLineNumbers(1 + lineDifference, line + lineDifference); 
    cursorY = 55 + 22 * line; 

    textAlign(RIGHT); 

    // Cursor 
    stroke(149, 203, 250); 
    strokeWeight(4); 
    line(cursorX, cursorY, cursorX - cursorLength, cursorY); 
    noStroke(); 

    textAlign(CENTER); 
} 

// Updates content and locations from user typing 
void keyPressed() 
{ 
    String[] allLines = content.split("(?<=\n)"); 
    boolean willPrint = false; 

    if (key == BACKSPACE) 
    { 
    if (column <= 1) 
    { 
     if (line > 1) 
     { 
     line--; 
     lineSubtracted = true; 
     finished = false; 
     } 

     column = 2; 

     if (lineSubtracted == true && allLines[allLines.length - 1].length() > 1 && allLines.length > 1) 
     { 
     column = allLines[allLines.length - 2].length(); 
     } 
    } 

    if (content.length() > 0) 
    { 
     content = content.substring(0, content.length() - 1); 
    } 

    column--; 
    } else if (key == TAB) 
    { 
    column += 4; 
    content += " "; 
    } else 
    { 
    if (key == ENTER) 
    { 
     line++; 
     column = 0; 
    } else if (lineSubtracted == true && finished == false && line > 1) 
    { 
     if (line == allLines.length) 
     { 
     content = content.substring(0, content.length() - 1); 
     } 

     finished = true; 
    } 

    content += key; 

    column++; 
    } 

    column = allLines[allLines.length - 1].length(); 
} 
+0

Почему вы не просто использовать графический интерфейс библиотеки как [G4P] (http://www.lagers.org.uk/g4p) или [ControlP5] (http://www.sojamo.de/libraries/controlP5/)? –

+0

@KevinWorkman В библиотеках нет плоского минималистского дизайна, которого я хочу достичь, и я действительно хочу сделать этот проект, поэтому я, к сожалению, не могу его использовать. Не могли бы вы взглянуть на проблему? Код не слишком длинный. Благодарю. Если вы хотите, вы можете указать мне на логику добавления и удаления на основе нажатия клавиш. Я действительно хочу, чтобы этот проект произошел. –

+0

С кодом, который вы опубликовали, синяя линия никогда не перемещается влево или вправо. «Не изобретать велосипед» - неплохой совет. –

ответ

1

Для чего вы стоите, вы перепрыгиваете через множество обручей, чтобы отобразить редактируемый текст. Вот упрощенный пример, который делает Обработка сделать работу за вас:

String text = ""; 
String cursor = "_"; 

boolean blink = true; 

void setup() { 
    size(500, 500); 
} 

void draw() { 

    if(frameCount % 30 == 0){ 
    blink = !blink; 
    } 

    background(0); 

    if(blink){ 
    text(text, 100, 100, 200, 200); 
    } 
    else{ 
    text(text+cursor, 100, 100, 200, 200); 
    } 
} 

void keyPressed() 
{ 
    if (key == BACKSPACE) 
    { 
    if (text.length() > 0) { 
     text = text.substring(0, text.length()-1); 
    } 
    } else { 
    text += key; 
    } 
} 
+0

Спасибо большое. –

+0

@Henry Нет проблем. Я все еще думаю, что вам может быть лучше использовать графическую библиотеку - вы будете удивлены тем, насколько они могут быть настраиваемыми. Вы можете даже комбинировать мой простой подход с библиотекой gui, если хотите. Но то, как вы изначально делали это, казалось, что вы делаете больше работы, чем вам нужно! И если вы действительно хотите создать сложный графический интерфейс, вы можете подумать о «окончании» с «Обработка на Java» или «html/JavaScript»! –

Смежные вопросы