[jdk20] RFR: 4512626: Non-editable JTextArea provides no visual indication of keyboard focus [v2]

Alexander Zuev kizune at openjdk.org
Fri Dec 16 20:05:17 UTC 2022


On Fri, 16 Dec 2022 01:19:46 GMT, Alexander Zvegintsev <azvegint at openjdk.org> wrote:

>> Alexander Zuev has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   Fixed MultiSelectionText so it is now stable on Linux
>>   Removed both fixed tests from ProblemList
>
> src/java.desktop/share/classes/javax/swing/text/DefaultCaret.java line 389:
> 
>> 387:             } else {
>> 388:                 if (getBlinkRate() != 0) {
>> 389:                     savedBlinkRate = getBlinkRate();
> 
> Look like this can override blink rate set by user:
> 
> 
> import javax.swing.JButton;
> import javax.swing.JFrame;
> import javax.swing.JTextField;
> import javax.swing.SwingUtilities;
> import java.awt.BorderLayout;
> import java.awt.Component;
> import java.awt.Robot;
> import java.lang.reflect.InvocationTargetException;
> 
> public class CaretThing {
> 
>     static JFrame frame;
>     static JTextField textField;
>     static Robot robot;
>     static JButton button;
> 
>     static void printBlinkRate() {
>         System.err.println("Caret blink rate: " + textField.getCaret().getBlinkRate());
>     }
> 
>     static void requestFocus(Component component) throws InterruptedException, InvocationTargetException {
>         robot.waitForIdle();
>         robot.delay(300);
> 
>         SwingUtilities.invokeAndWait(() -> {
>             System.err.println("Requesting focus on " + component);
>             printBlinkRate();
>             component.requestFocus();
>             printBlinkRate();
>         });
>     }
> 
>     static void changeEditable() throws InterruptedException, InvocationTargetException {
>         robot.waitForIdle();
>         robot.delay(300);
>         SwingUtilities.invokeAndWait(()-> {
>             System.err.println("Changing editable");
>             printBlinkRate();
>             textField.setEditable(!textField.isEditable());
>             printBlinkRate();
>         });
>     }
> 
>     public static void main(String[] args) throws Exception {
>         robot = new Robot();
>         robot.setAutoWaitForIdle(true);
>         robot.setAutoDelay(50);
> 
>         SwingUtilities.invokeAndWait(() -> {
>             frame = new JFrame("Hey");
>             frame.setLocationRelativeTo(null);
>             textField = new JTextField("Some long field value");
> 
>             textField.setEditable(false);
>             frame.setLayout(new BorderLayout());
>             frame.add(textField, BorderLayout.NORTH);
> 
>             button = new JButton("Button");
>             button.addActionListener((e)-> printBlinkRate());
> 
>             frame.add(button, BorderLayout.CENTER);
>             frame.pack();
>             frame.setVisible(true);
> 
>             button.requestFocus();
>             textField.getCaret().setBlinkRate(2500);
>         });
> 
>         requestFocus(textField);
> 
>         requestFocus(button); // comment this to get 0 blink rate on editable field
> 
>         changeEditable();
> 
>         requestFocus(textField);
> 
>         SwingUtilities.invokeAndWait(CaretThing::printBlinkRate);
>     }
> }
> 
> Running the sample above at least two possible misbehaviors(tested on Linux):
> * you will receive blink rate `500` instead of user set `2500`
> * but if you comment `requestFocus(button);` line then blink rate will be `0` (it shows non-blinking cursor)
> 
> <hr>
> 
> Other than that I am worried about `getBlinkRate()` does not return the same value as passed to`setBlinkRate()` (e.g. case when component is not editable, possible JCK issue?)

I updated the code now the behaviour is correct (as far as i tested) and the blink rate is reported as if it is set to the correct value even on non-editable text element.

-------------

PR: https://git.openjdk.org/jdk20/pull/21



More information about the client-libs-dev mailing list