Я приближаюсь к заполнению текстового поля для моего текстового редактора кроме выбора и нескольких ошибок с текстовым курсором. Я должен реализовать его с нуля, потому что другие библиотеки не соответствуют потребностям дизайна для моего редактора. Каждый раз, когда пользователь завершает линию и начинает обратную позицию на следующей строке, курсор и текст не будут правильно размещены, когда пользователь начнет вводить текст (курсор не находится на правой линии). Разрыв становится еще более значительным, когда пользователь держит это снова и снова.Обработка Java: позиция курсора текстового поля выключена
Вы можете ясно видеть, что курсор (светло-голубой) и текст не выровнены должным образом. Я прикрепил код, относящийся только к этой проблеме. Извините, если текстовое поле не находится в оптимальном положении, так как я перенес код из текстового редактора в деградированную версию для этой проблемы.
То, что я считаю виновным: Через пару часов я обнаружил, что позиция курсора зависит от строки и столбца (как указано на ярлыках). Я не прикреплял метки к примеру в Эта проблема. Линия показывает 2, но она должна быть 1. Когда столбец равен 1, а промежутки времени пользователя, линия должна уменьшаться на 1, а столбец - на длину предыдущей строки.
Если у вас есть вопросы, я был бы более чем счастлив ответить на них. Поскольку код был сложным для передачи, многие из них не будут работать должным образом (с курсором перемещаются по горизонтали, так как пользователь вводит), но я думаю, что это достаточно хорошо, чтобы решить проблему.
Как добраться проблемы:
- Введите текст в первой строке
- Hit введите
- 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();
}
Почему вы не просто использовать графический интерфейс библиотеки как [G4P] (http://www.lagers.org.uk/g4p) или [ControlP5] (http://www.sojamo.de/libraries/controlP5/)? –
@KevinWorkman В библиотеках нет плоского минималистского дизайна, которого я хочу достичь, и я действительно хочу сделать этот проект, поэтому я, к сожалению, не могу его использовать. Не могли бы вы взглянуть на проблему? Код не слишком длинный. Благодарю. Если вы хотите, вы можете указать мне на логику добавления и удаления на основе нажатия клавиш. Я действительно хочу, чтобы этот проект произошел. –
С кодом, который вы опубликовали, синяя линия никогда не перемещается влево или вправо. «Не изобретать велосипед» - неплохой совет. –