Get the location of writing cursor (keyboard) in text area of app designer
22 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
I am creating a simple text editor. I just want to get the location of writing cursor inside the text area so that I can insert some text in this location when clicking a button. Is there any method to get which row and column inside the text area?
0 comentarios
Respuestas (1)
Harsha Vardhan
el 1 de En. de 2024
Hi,
I understand that you want to insert text next to the existing text when a button is clicked.
This can be done by appending new text to the existing text as below.
I created a textbox and button as shown below.
Whenever the 'Button' is clicked, the current time is appened next to the existing text in the textbox.
Please check callback function associated with Button click below. This function appends next text whenever 'Button' is clicked.
% Button pushed function: Button
function ButtonPushed(app, event)
% Get the current time as a string
currentTime = char(datetime('now', 'Format', 'HH:mm:ss'));
% Check if the TextArea is empty
if isempty(app.TextArea.Value)
% If empty, add the current time without a comma
newContent = currentTime;
else
% If not empty, append the current time with a comma and space
newContent = [char(app.TextArea.Value), ', ', currentTime];
end
% Update the TextArea with the new content
app.TextArea.Value = newContent;
end
Similarly, one more use case is below. Whenever, the button is clicked a new number is appended to the text box, which counts the number of times the button was clicked. And this time, there is no space or comma between these numbers.
Please check the screenshot of the App below.
Add a property called ButtonClickCount as below.
properties (Access = public)
ButtonClickCount double = 0; % New property to track button clicks
end
Please check callback function associated with Button click below. This function appends next text whenever 'Button' is clicked.
% Button pushed function: Button
function ButtonPushed(app, event)
% Increment the button click count
app.ButtonClickCount = app.ButtonClickCount + 1;
% Convert the count to string
countStr = num2str(app.ButtonClickCount);
% Append the count to the existing content of the TextArea
newContent = [char(app.TextArea.Value), countStr];
% Update the TextArea with the new content
app.TextArea.Value = newContent;
end
Hope this helps in resolving your query!
2 comentarios
Harsha Vardhan
el 3 de En. de 2024
Editada: Harsha Vardhan
el 3 de En. de 2024
Multiple MATLAB answers suggest to manipulate the internal Java objects for the GUIDE based textbox.
- https://in.mathworks.com/matlabcentral/answers/415003-how-to-move-cursor-line-within-edit-box-of-uicontrol#answer_332885
- https://in.mathworks.com/matlabcentral/answers/271058-how-to-determine-cursor-position-in-edit-uicontrol#answer_212034
- https://in.mathworks.com/matlabcentral/answers/10993-set-cursor-position-in-multiline-uicontrol-edit-box#answer_15052
This answer explains about placing the cursor at the desired location in the textbox - https://in.mathworks.com/matlabcentral/answers/2047942-need-to-position-cursor-at-a-specific-character-in-a-uieditfield-string#answer_1369234
App Designer does not support direct control of cursor position in MATLAB R2023b. So, you can try either of these methdods.
Method 1: Using 'CurrentPoint' and 'Position' Properties
This method involves getting the 'CurrentPoint' property from the figure and comparing it against the 'Position' property of the edit box to estimate the cursor's position. However, this approach has a significant limitation: it doesn't precisely determine the cursor's position within the text but rather gives a rough estimate based on the mouse position. This method is not commonly used for text editors as it lacks accuracy.
Method 2: Using 'FindJObj' (https://www.mathworks.com/matlabcentral/fileexchange/14317-findjobj-find-java-handles-of-matlab-graphic-objects ) to Access Java Object
Note: 'FindJObj' is a 3rd party library not supported by MathWorks.This approach requires the Java Swing components underlying MATLAB's GUI elements.
The 'FindJObj' utility can be used to access the underlying Java object of MATLAB GUI components, offering more control. Here’s how you can use it:
- Install 'FindJObj': If you don't already have 'FindJObj', you can download it from the MATLAB File Exchange - https://www.mathworks.com/matlabcentral/fileexchange/14317-findjobj-find-java-handles-of-matlab-graphic-objects
- Access the Java Object: Use 'FindJObj' to get the Java object of the text edit component.
- Get and Set Cursor Position: Use Java methods to get the current cursor position and insert text.
Please find sample code below.
function multiLineTextEditor
% Create a figure and text edit box
hFig = figure;
hEdit = uicontrol('Style', 'edit', 'Max', 10, 'Position', [20 100 260 100]);
% Create a button to insert text
hButton = uicontrol('Style', 'pushbutton', 'String', 'Insert Text', ...
'Position', [20 50 100 30], 'Callback', @insertText);
% Use FindJObj to access the Java object of the edit box
jhEdit = findjobj(hEdit);
jEdit = jhEdit.getComponent(0).getComponent(0);
function insertText(~, ~)
% Get the current caret (cursor) position
caretPos = jEdit.getCaretPosition;
% Define the text to insert
newText = 'Hello MATLAB!';
javaCurrentText = jEdit.getText;
mlCurrentText = char(javaCurrentText);
% Insert new text at the caret position
updatedText = [mlCurrentText(1:caretPos), newText, mlCurrentText(caretPos+1:end)];
% Update the text in the edit box
set(hEdit, 'String', updatedText);
end
end
Using the above code, though the text gets inserted at the cursor, a problem persists. In each new line of the textbox, wherever the cursor may be, the first insertion using the button is always at the right most point. Later insertions are working correctly at the cursor's location. You may explore further into this.
Ver también
Categorías
Más información sobre Environment and Settings en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!