On Fri, 16 Dec 2022 01:19:46 GMT, Alexander Zvegintsev <[email protected]> 
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

Reply via email to