2016-12-14 6 views
0

Я создаю калькулятор в JavaFX. У меня есть метка с fx: ID #labelResult, в стиле css. Теперь я добавил слушателя клавиатуры в главное окно. Таким образом, когда я нажимаю Влево/Вправо стрелка. Я меняю цвет фона #labelResult на цвет из строки bgColors array. Я также добавил функциональность, чтобы изменить размер шрифта меток, когда Upper/Down клавиши со стрелками. Теперь проблема есть. Кажется, что я не могу одновременно использовать оба эффекта. Поэтому, когда у меня изменился цвет фона ярлыка, и я запускаю механизм изменения размера шрифта, эффект размера шрифта применяется к метке, а эффект цвета bg сбрасывается. Как я могу использовать оба эффекта одновременно?Как я могу применить более одного стиля к одному узлу одновременно программно

P.S: Я использовал метод setStyle для применения стиля в обоих случаях в контроллере.

CSS (before applying styles in my controller) 

#labelRESULT { 
-fx-background-color: rgba(59, 74, 107, 0.8); 
-fx-font-size: 45px; 
-fx-text-fill: #fff; 
} 

Controller.java

@FXML 
private Label labelRESULT; 

@FXML 
private void handleKeys(KeyEvent event) { 
    int size = 45; 
    String keyPressed = event.getCode().toString().toUpperCase(); 
    switch (keyPressed) { 
     case "RIGHT": 
      labelRESULT.setStyle("-fx-bg-color: #" + bgColors[1]); 
      break; 
     case "UP": 
      labelRESULT.setStyle("-fx-font-size: " + (size + 2) + "px;"); 
      break; 
    } 
} 

Изображение что происходит: http://imgh.us/javafx-calc.png

1- перед наклеиванием стилей

программно

2- после изменения Б.Г. цвет этикетки

3- после изменения размера шрифта метки в то время как Б.Г. цвета меняются

+0

когда это вы «setStyle», вы переопределяете все предыдущие стили. Лучшим решением является создание отдельного файла css и переход между классами. –

+0

@fabian спасибо, добавлены перерывы. –

ответ

0

Может быть, это помогает, если вы Concat результат GetStyle() (т.е. BGColor) с дополнительным стилем (т.е. FONTSIZE), а затем использовать SetStyle снова()?

EDIT это будет еще один вариант (установить флаг в истинным или ложным в нужном месте):

labelRESULT.pseudoClassStateChanged(PseudoClass.getPseudoClass("left-right-pressed"), flag); 


labelRESULT.pseudoClassStateChanged(PseudoClass.getPseudoClass("up-down-pressed"), flag); 

и определить пользовательский класс псевдо в вашем CSS:

:left-right-pressed { 
    -fx-background-color: yellow; 
} 

:up-down-pressed { 
    -fx-font-size: 14; 
} 
+1

Отлично! конкатенирование работало просто отлично !! Не знаю, почему я об этом не думал. Снова спасибо = D –

+0

Только один вопрос. Теперь у меня другая проблема. Каждый раз, когда я меняю цвет фона или размер текста, строка (getStyle) становится все больше и больше. Можно ли заменить эффект одного и того же типа. Как и я хочу заменить фоновый эффект другим, не добавляйте новый эффект каждый раз в таблицу стилей. http://imgh.us/2016-12-14_15h31_07.png –

+0

@RafatRefai просто сохраняет состояние где-то и заменяет 'style' на основе состояния.В зависимости от состояния нет, нужно включить только одну или обе части ... – fabian

0

Вы можете просто добавить/переключатель CSS-классы для ваших узлов.

JavaFXUtils.addClasses(node, "my-class-for-font"); 
JavaFXUtils.removeClasses(node, "my-class-for-color"); 
+0

Как я могу это сделать. Можете ли вы предоставить код, пожалуйста? Я обновил свой вопрос, чтобы включить часть моего контроллера, можете ли вы взглянуть? –

+0

Добавлен код для ответа –

+0

Спасибо. другой ответ решил мой вопрос. Но я также попробую ваш метод и посмотреть, работает ли он –

 Смежные вопросы

  • Нет связанных вопросов^_^