Как использовать все цвета при вводе в текстовое поле, не жестко закодированное в JavaFX - PullRequest
1 голос
/ 02 ноября 2019

Цвета должны быть набраны в текстовом поле, чтобы нарисовать или добавить форму, которая должна изменить цвет. Это означает, что когда пользователь вводит синий цвет, цветовой круг или круг станут синими. Однако я не получаю результат. Я выбрал круг, и он дает пробел. Ничья просто нарисует обычный черный. Я думаю, что этот кусок кода является проблемой gc.setFill(getJavaFXColorMap().get(ke.getText())); Вот некоторые из кодов. Дайте мне знать, если вам нужно больше кодов.

ОБНОВЛЕНИЕ: внизу

//colorText will change color used to draw on the canvas.
        colorText.setOnKeyPressed(new EventHandler<KeyEvent>() {
            public void handle(KeyEvent ke) {
                    //if the key entered is the "Enter" button, do this following code.
                if (ke.getCode().equals(KeyCode.ENTER)) {
                    canvas.setOnMousePressed(q -> {
                        try {
                            if (getJavaFXColorMap().get(ke.getText()) == getJavaFXColorMap().get(ke.getText())) {
                                gc.setFill(getJavaFXColorMap().get(ke.getText()));
                            }
                        } catch (NoSuchFieldException e) {
                            // TODO Auto-generated catch block
                            System.out.println("It is not working sorry");
                            e.printStackTrace();
                        }
                    });

                }
            }
        });

Вот метод всех цветов

public Map<String, Color> getJavaFXColorMap() throws NoSuchFieldException {
        Field[] declaredFields = Color.class.getDeclaredFields();
        Map<String, Color> colors = new HashMap<>();
        for (Field field : declaredFields) {
            if (Modifier.isStatic(field.getModifiers()) && Modifier.isPublic(field.getModifiers())) {
                try {
                    colors.put(field.getName(), (Color)field.get(null));
                } catch (SecurityException | IllegalArgumentException | IllegalAccessException ex) {
                    Logger.getLogger(PaintJFX.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return colors;
    }

ОБНОВЛЕНИЕ: вот что я делаю, я получаю неверную спецификацию цвета. Я попробовал то, что вы сказали.

// method for converting string to color
  private Color setFillOfShape(String colorName) {
             Color colorNameAgain = Color.web(colorName);
             return colorNameAgain;
         }

//colorText will change color used to draw on canvas.
        colorText.setOnKeyPressed(new EventHandler<KeyEvent>() {
            public void handle(KeyEvent ke) {
                    //if the key entered is the "Enter" button, do this following code.
                if (ke.getCode().equals(KeyCode.ENTER)) {
                    canvas.setOnMousePressed(q -> {
                            if (setFillOfShape(ke.getText()) == setFillOfShape(ke.getText())) {
                                gc.setFill(setFillOfShape(ke.getText()));                       
                            }
                    });
                }
            }
        });

1 Ответ

1 голос
/ 02 ноября 2019

Если я правильно понимаю ваш вопрос, вы хотите взять значение TextField и преобразовать его в Color. Например, если пользователь набирает «blue» и нажимает Enter , тогда вы должны получить Color.BLUE. Это возможно с использованием метода Color#web(String):

Создает цвет RGB, указанный в строке атрибута HTML или CSS.

Этот метод поддерживает следующие форматы:

  • Любое стандартное имя цвета HTML

  • Шестнадцатеричная строка длинного или короткого формата HTML с необязательным шестнадцатеричным альфа-каналом. Шестнадцатеричным значениям может предшествовать либо "0x" или "#", и они могут состоять из 2 цифр в диапазоне от 00 до 0xFF или одной цифры в диапазоне от 0 до F.

  • Строка формата rgb(r,g,b) или rgba(r,g,b,a). Каждое из значений r, g или b может быть целым числом от 0 до 255 или процентным значением с плавающей запятой от 0.0 до 100.0, за которым следует процент (%) характер. Альфа-компонент, если он присутствует, представляет собой значение с плавающей запятой от 0.0 до 1.0. Пробелы допускаются до или после чисел, а также между числом процента и его знаком процента (%).

  • Строка формата hsl(h,s,l) или hsla(h,s,l,a). Значение h представляет собой число с плавающей запятой от 0.0 до 360.0, представляющее угол оттенка на цветовом круге в градусах, где 0.0 или 360.0 обозначает красный, 120.0 обозначает зеленый и 240.0 обозначаетсиний. Значение s - это насыщенность желаемого цвета, представленная в процентах с плавающей запятой от серого (0.0) до полностью насыщенного цвета (100.0), а значение l - желаемая яркость или яркость желаемогоцвет представлен как процент с плавающей запятой от черного (0.0) до полной яркости цвета (100.0). Альфа-компонент, если он присутствует, представляет собой значение с плавающей запятой от 0.0 до 1.0. Пробелы допускаются до или после чисел, а также между числом процента и его знаком процента (%).

[...]

Вотпример:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;

public class App extends Application {

  @Override
  public void start(Stage primaryStage) {
    Rectangle rect = new Rectangle(100, 100);

    TextField field = new TextField();
    field.setOnAction(event -> {
      event.consume();
      setFillOfShape(rect, field.getText().strip());
    });

    HBox root = new HBox(25, field, rect);
    root.setPadding(new Insets(10));

    primaryStage.setScene(new Scene(root));
    primaryStage.show();
  }

  private void setFillOfShape(Shape shape, String colorName) {
    try {
      shape.setFill(Color.web(colorName));
    } catch (IllegalArgumentException ex) {
      Alert alert = new Alert(AlertType.ERROR);
      alert.initOwner(shape.getScene().getWindow());
      alert.setHeaderText(null);
      alert.setContentText("Unrecognized color: " + colorName);
      alert.showAndWait();
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...