2013-10-14 59 views
0

這是一個簡單的程序,我寫了一個圓角矩形背景上的舞臺上的按鈕。測量JavaFX文本的長度

package definitive_guide; 

import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Toolkit; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.SceneBuilder; 
import javafx.scene.control.Button; 
import javafx.scene.control.ButtonBuilder; 
import javafx.scene.layout.Region; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.StackPaneBuilder; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.scene.shape.RectangleBuilder; 
import javafx.scene.text.Font; 
import javafx.stage.Stage; 

public class SingleButton extends Application { 
    Button btn; 
    Scene scene; 
    StackPane stack; 
    Rectangle roundedRectangle; 

    @Override 
    public void start(Stage stage) throws Exception { 
     btn = ButtonBuilder 
       .create() 
       .font(Font.font("DejaVu Sans Mono",22)) 
       .text("Hello World") 
       .build(); 

     roundedRectangle = RectangleBuilder 
       .create() 
       .width(300) 
       .height(300) 
       .arcHeight(150) 
       .arcWidth(200) 
       .fill(Color.rgb(128, 128, 128)) 
       .build(); 

     stack = StackPaneBuilder 
       .create() 
       .children(roundedRectangle , btn) 
       .build(); 
     stack.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 

     scene = SceneBuilder 
       .create() 
       .root(stack) 
       .build(); 

     stage.setScene(scene); 
     stage.show(); 


    } 


    public static void main(String[] args) { 
     Application.launch("definitive_guide.SingleButton.java"); 
    } 

} 

現在,手動輸入長方形的長度,寬度和弧的值。所以,他們不是動態的。

我希望能夠根據文本的大小和一些填充來設置其大小,以便在不同分辨率的設備上具有一致的外觀和感覺。
在Swing中,FontMetrics很方便,但我不知道在JavaFX中該做什麼。

我該怎麼做?

+0

什麼版本的JavaFX?在FX8中沒有公開的API,其中所有的字體都從低級抽象出來。 – tomsontom

+0

@tomsontom版本2.2 –

回答

1

如果你真的關心Text,試試這個:

final Text text = new Text("Click me"); 
text.setFont(Font.font("DejaVu Sans Mono", 42)); 

text.setOnMouseClicked(new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent event) { 
     // set with long text 
     text.setText("Hello Sun, Hello Galaxy, Hello Space!"); 
    } 
}); 

text.layoutBoundsProperty().addListener(new ChangeListener<Bounds>() { 
    @Override 
    public void changed(ObservableValue<? extends Bounds> observable, Bounds oldValue, Bounds newValue) { 
     if(oldValue.getHeight() != newValue.getHeight() || oldValue.getWidth()!= newValue.getWidth()) { 
      roundedRectangle.setWidth(newValue.getWidth() + 100); 
      roundedRectangle.setHeight(newValue.getHeight() + 30); 
     } 
    } 
}); 

否則,如果按鈕上的文字是你的興趣,你可以直接嘗試綁定按鈕:

roundedRectangle.widthProperty().bind(btn.widthProperty().add(100)); 
roundedRectangle.heightProperty().bind(btn.heightProperty().add(30)); 

弧寬度並且高度值也是可綁定的:

roundedRectangle.arcHeightProperty() 
roundedRectangle.arcWidthProperty() 
+0

WOW!我沒有意識到這一點!需要研究它 –