2017-05-25 51 views
2

有没有办法在JavaFx8中选择一个标签文本?我知道,还有其他简单的解决方法就像使用TextField一样。但是我的标签需要多行文字和TextField没有提供的包装功能。如果我使用TextArea,问题是我无法根据文本的大小像标签一样缩小TextArea。所以我不能使用他们中的任何一个。如何使Javafx标签可选

而且我使用的标签文本是象下面这样:

<VBox> 
    <Label wrapText="true" 
      VBox.vgrow="ALWAYS" 
      maxHeight="Infinity" minHeight="-Infinity" 
      text="Some Random Subject Line With Very Large Text To Test The Wrap Text, Lorem Ipsum Dolor"/>      
</VBox> 

根据垂直框宽度,标签的高度调整大小以完全适合文本。我无法使用TextArea或TextField来模拟这种行为。但我需要能够从标签中选择文本。有任何想法吗?

+0

我不认为这是可能的,或者至少那是什么[这里](https://community.oracle.com/thread/2319231)甲骨文suggests.Looks喜欢它的线程的请求功能在未来的版本中实施。 –

+0

那么任何人都可以创建任何开源自定义控件? –

+0

试试这个:https://stackoverflow.com/questions/22534067/copiable-label-textfield-labeledtext-in-javafx – 2017-05-25 07:30:05

回答

4

这是一个解决方法,直到有人发布更好的东西。

如果您双击标签,它将更改为TextArea。然后您可以复制文本。一旦按下TextArea上的输入,它就会变回标签。

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextArea; 
import javafx.scene.input.MouseButton; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

/** 
* 
* @author blj0011 
*/ 
public class JavaFXApplication110 extends Application 
{ 

    @Override 
    public void start(Stage primaryStage) 
    { 
     VBox root = new VBox(); 

     StackPane stackpane = new StackPane();   

     Label label = new Label("Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world Hello world"); 
     VBox.setVgrow(label, Priority.ALWAYS); 
     label.wrapTextProperty().set(true); 

     label.setOnMouseClicked(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent mouseEvent) { 
       if(mouseEvent.getButton().equals(MouseButton.PRIMARY)){ 
        if(mouseEvent.getClickCount() == 2){ 
         label.setVisible(false); 
         TextArea textarea = new TextArea(label.getText()); 
         textarea.setPrefHeight(label.getHeight() + 10); 
         stackpane.getChildren().add(textarea); 

         textarea.setOnKeyPressed(event ->{ 
          System.out.println(event.getCode()); 
          if(event.getCode().toString().equals("ENTER")) 
          { 
           stackpane.getChildren().remove(textarea); 
           label.setVisible(true);        
          } 
         }); 
        } 
       } 
      } 
     }); 

     stackpane.getChildren().add(label); 

     root.getChildren().add(stackpane); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) 
    { 
     launch(args); 
    } 

} 
+0

这是一个聪明的解决方法,我喜欢它。 –