2016-04-10 3 views
0

В течение прошлой недели или 2 я экспериментировал с различными способами манипулирования фигурами и текстовыми объектами в сцене с использованием JavaFX.Изменение размера отдельных объектов текста

В настоящее время я ищу создание новых текстовых объектов и возможность управлять их размером.

Итак, у меня есть сцена с кнопкой, которая просто говорит «Текст», что после нажатия создает TextField, посредством чего при вводе текста в это поле создается новый текстовый объект. Существует также слайдер, который вы можете использовать для изменения размера текстового объекта. и вы сможете перетащить различные текстовые объекты о

import javafx.application.Application; 
import javafx.beans.value.ObservableValue; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Slider; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.Pane; 
import javafx.scene.text.Font; 
import javafx.scene.text.Text; 

public class CreatingNewText extends Application 
{ 
    private int size; 
    private TextField enterText; 
    private Slider sizeSlider; 
    private Button button; 
    public static void main(String [] args) 
    { 
     launch(args); 
    } 
    public void start(Stage primaryStage) 
    { 
     Pane root = new Pane(); 
     // Button for creating new text Object 
     button = new Button("text"); 
     button.setLayoutX(200); 

     // Slider for Size 
     sizeSlider = new Slider(0,255,0); 
     sizeSlider.setLayoutX(250); 
     sizeSlider.setLayoutY(0); 

     // Button functionality 
     button.setOnAction(e ->{ 
      Text text = new Text(150,300,"Text"); 
      // Moving created text 
      text.setOnMouseDragged(f ->{ 
      text.setX(f.getX()); 
      text.setY(f.getY()); 
      }); 
      text.setLayoutX(300); 
      text.setLayoutY(300); 
      text.setFont(Font.font("Phosphate")); 
      // Text entry field 
      enterText = new TextField(); 
      text.textProperty().bind(enterText.textProperty()); 
      // Slider functionality 
      text.setOnMouseEntered(g ->{  
      }); 
      sizeSlider.valueProperty().addListener((ObservableValue 
       <? extends Number> ov, Number curVal, Number newVal) ->  { 
        size = (int) sizeSlider.getValue(); 
        Font fontSize = Font.font(size); 
        text.setFont(fontSize); 
       }); 
      root.getChildren().addAll(enterText,text); 
     }); 

     root.getChildren().addAll(button,sizeSlider); 
     Scene scene = new Scene(root,600,600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
} 

Проблемы -

  1. Я не могу изменить размер конкретного текстового объекта - Я понимаю, что каждый раз, когда я создаю новый текст объект присваивает его переменной «текст», и поэтому при изменении размера с помощью ползунка все текстовые формы, связанные с «текстом», также изменятся, как это можно исправить?

  2. Я также уверен, что одно и то же происходит для текстового поля - каждый раз, когда кнопка текста нажата, он просто создает новое текстовое поле, которое просто сидит поверх старого. Я попытался создать свое текстовое поле вне события действия - похоже на слайдер, но не может, потому что текстовый объект является локальным для события действия. Создание «текста» переменной экземпляра просто усложняет ситуацию, и я получаю ошибку «исключение в запуске приложения» - так что в основном это не работает. Действительно, я хочу только одно текстовое поле, которое может создавать несколько текстовых объектов.

Извиняется за код. Я очень неопытен, и это даже выглядит беспорядочным для меня. Надеюсь, что вопрос тоже имеет смысл.

+0

По вопросу 2: Почему вы создаете в другом текстовом поле. Какова цель? – user43968

+0

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

+0

Нет проблем с помещением текстового поля, как ползунок, и кнопка просто перемещает строку 'enterText = new TextField();' ниже 'sizeSlider.setLayoutY (0);' и проверяет ваш addAll 'root.getChildren(). AddAll (текст); 'root.getChildren(). addAll (button, sizeSlider, entertext);' – user43968

ответ

1

Посмотрите на этот образец приложения, сделанного из вашего кода. Я думаю, что это показывает, что вы пытаетесь достичь:

Нажмите на тексте, он становится красным, и вы можете настроить его размер с помощью ползунка

public class CreatingNewText extends Application { 
private int size; 
private TextField enterText; 
private Slider sizeSlider; 
private Button button; 

private Text selected; 

public static void main(String[] args) { 
    launch(args); 
} 

public void start(Stage primaryStage) { 
    Pane root = new Pane(); 
    // Button for creating new text Object 
    button = new Button("text"); 
    button.setLayoutX(200); 

    // Slider for Size 
    sizeSlider = new Slider(0, 255, 0); 
    sizeSlider.setLayoutX(250); 
    sizeSlider.setLayoutY(0); 

    // TextField 
    enterText = new TextField(); 

    // Button functionality 
    button.setOnAction(e -> { 
     Text text = new Text(150, 300, "Text"); 
     // Moving created text 
     text.setOnMouseDragged(f -> { 
      text.setX(f.getX()); 
      text.setY(f.getY()); 
     }); 
     text.setLayoutX(300); 
     text.setLayoutY(300); 
     text.setFont(Font.font("Phosphate")); 

     text.textProperty().bind(enterText.textProperty()); 

     text.addEventHandler(MouseEvent.MOUSE_PRESSED, mouseEvent -> { 

      if (selected != null) { 
       selected.setFill(Color.BLACK); 
      } 

      selected = (Text) mouseEvent.getTarget(); 
      selected.setFill(Color.RED); 

     }); 

     root.getChildren().addAll(text); 
    }); 

    sizeSlider.valueProperty().addListener((ObservableValue<? extends Number> ov, Number curVal, Number newVal) -> { 

      if (selected != null) { 
      size = (int) sizeSlider.getValue(); 
      Font fontSize = Font.font(size); 
      selected.setFont(fontSize); 
     } 
    }); 

    root.getChildren().addAll(button, sizeSlider, enterText); 
    Scene scene = new Scene(root, 600, 600); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
} 
+1

это здорово, именно то, что я хотел + дополнительный красный механизм выделения! Спасибо, его оценили – Treeno1

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