Статьи

Как избавиться от выделения фокуса в JavaFX

Сегодня меня спросили, знаю ли я, как избавиться от выделения фокуса элементов управления JavaFX (соответственно кнопок):

button_hover

Большинство постов и советов по этой проблеме предлагают добавить:

1
2
3
.button:focused {
    -fx-focus-color: transparent;
}

Но с этим стилем, сияние как это все еще остается:

button_glow

Чтобы избавиться от этого свечения, также часто предлагается поиграть с -fx-background-insets дополнительно:

1
2
3
4
.button:focused {
    -fx-focus-color: transparent;
    -fx-background-insets: -1.4, 0, 1, 2;
}

Но это приводит к кнопке, отображаемой без внешней границы:

button_insets

По сравнению со стилем кнопок по умолчанию:

кнопка

это все еще своего рода «выделение».

Почему это? (И почему на самом деле есть 4 значения вставки?)

Если посмотреть на стиль JavaFX по умолчанию, определенный modena.css то modena.css немного больше информации:

1
2
3
4
5
6
/* A bright blue for the focus indicator of objects. Typically used as the
* first color in -fx-background-color for the "focused" pseudo-class. Also
* typically used with insets of -1.4 to provide a glowing effect.
*/
-fx-focus-color: #f25f29;
-fx-faint-focus-color: #f25f2933;

Очевидно, что существует не только один цвет фокуса -fx-focus-color но также -fx-faint-focus-color который предназначен для создания этого эффекта свечения (который остается при установке -fx-focus-color:transparent; ).

Присмотритесь к псевдоклассу .button: focus (в modena.css ):

1
2
3
4
5
.button:focused {
    -fx-background-color: -fx-faint-focus-color, -fx-focus-color, -fx-inner-border, -fx-body-color;
    -fx-background-insets: -2, -0.3, 1, 2;
    -fx-background-radius: 7, 6, 4, 3;
}

Игра с какой-то экстремальной окраской раскрывает аранжировку:

01
02
03
04
05
06
07
08
09
10
.button:focused {
    -fx-focus-color: red;
    -fx-faint-focus-color: green;
    -fx-inner-border: blue;
    -fx-body-color: orange;
 
    -fx-background-color: -fx-faint-focus-color, -fx-focus-color, -fx-inner-border, -fx-body-color;
    -fx-background-insets: -2, -0.3, 1, 2;
    -fx-background-radius: 7, 6, 4, 3;
}

button_hover_style

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

1
2
3
4
5
.button:focused {
    -fx-background-color: -fx-outer-border, -fx-inner-border, -fx-body-color;
    -fx-background-insets: 0, 1, 2;
    -fx-background-radius: 5, 4, 3;
}
Ссылка: Как избавиться от выделения фокуса в JavaFX от нашего партнера JCG Дженса Детерса в блоге JavaFX Delight .