如何在JavaFX中繪製Lower-Etched-Border
類似於Swing標籤中顯示的內容?JavaFx:繪製一個類似揮杆的蝕刻邊界可能嗎?
2
A
回答
3
我研究了用於JavaFX的Lowered-Etched-Border
,但是我沒有找到任何有效的文檔。我也測試了InnerShadow
和其他效果,那些不適合。所以我用這種邊框樣式創建了一個LEBLabel
(Label
的子類)。
public class LoweredEtchedBorderLabelDemo extends Application {
@Override
public void start(Stage primaryStage) {
LEBLabel text = new LEBLabel("Testing", 200, 30);
StackPane root = new StackPane();
root.getChildren().add(text);
root.setStyle("-fx-background-color:lightgrey");
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Lowered-Etched-Border Demo");
primaryStage.setScene(scene);
primaryStage.show();
}
//Lowered Etched Borderd Label
private class LEBLabel extends Label {
private HBox[] borders = new HBox[3];
private String border_styles[] = {"-fx-border-width:0 1 1 0; -fx-border-color: white",
"-fx-border-width:1; -fx-border-color:grey",
"-fx-border-width:1 0 0 1; -fx-border-color:white"};
public LEBLabel(String text, double width, double height) {
super(text);
for(int i = 0; i < borders.length; i++) {
borders[i] = new HBox();
borders[i].setStyle(border_styles[i]);
//decrement of border-size for inner-border, prevents from the overlapping of border
borders[i].setMaxSize(width - (1.5 *i), height - (1.5 * i));
borders[i].setMinSize(width - (1.5 *i), height - (1.5 * i));
borders[i].setSpacing(0);
}
this.setContentDisplay(ContentDisplay.CENTER);
this.borders[1].getChildren().add(borders[2]);
this.borders[0].getChildren().add(borders[1]);
this.setGraphic(borders[0]);
}
}
public static void main(String[] args) {
launch(args);
}
}
注:此
LEBLabel
僅顯示,因此忽略了Text-Alignment Properties
在中心端的文本。
2
基於Region擴展與基於外部CSS文件的示例。
如果需要,此實現允許邊框包含任意可調整大小的內容(包括父佈局窗格)。例如,您可以將包含StackPane的內容放置在BorderPane中,並使用StackPane的「Optional Layout Constraints」來對齊內容併爲BorderPane中的內容定義邊距(有關如何完成的示例,請參閱鏈接的StackPane javadoc這個)。
此外,邊框本身的樣式可以從外部CSS文件自定義,因此應該可以相對容易地複製任何standard Swing borders(和其他邊框樣式)。
邊界pane.css
.border-pane {
-fx-border-base: gray;
-fx-border-shadow: white;
-fx-light-border: derive(-fx-border-base, 25%);
-fx-border-color: -fx-light-border -fx-border-base -fx-border-base -fx-light-border;
-fx-border-insets: 0 1 1 0;
-fx-background-color: -fx-border-shadow, -fx-background;
-fx-background-insets: 1 0 0 1, 2;
-fx-padding: 2;
}
LoweredEtchedBorderLabelBackgroundDemo.java
import javafx.application.Application;
import javafx.geometry.*;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.*;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class LoweredEtchedBorderDemo extends Application {
@Override
public void start(Stage stage) {
Label label = new Label("Testing");
label.setPadding(new Insets(10));
// uncomment to see the area that the content node is taking up within the border.
//label.setStyle("-fx-background-color: palegreen;");
BorderPane borderPane = new BorderPane(new StackPane(label));
// uncomment these two lines if you would like the border to resize to fit available space.
borderPane.setMinSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
borderPane.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
VBox layout = new VBox(borderPane);
layout.setPadding(new Insets(10));
layout.setStyle("-fx-base: lightgrey;");
VBox.setVgrow(borderPane, Priority.ALWAYS);
Scene scene = new Scene(layout);
stage.setScene(scene);
stage.show();
}
private class BorderPane extends Region {
// clip the bordered content within the bordered area.
Rectangle clipRect = new Rectangle(getWidth(), getHeight());
public BorderPane(Node content) {
super();
getChildren().add(content);
getStylesheets().add(getClass().getResource(
"border-pane.css"
).toExternalForm());
getStyleClass().add("border-pane");
// by default size the border to the preferred size of the content.
setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
content.setClip(clipRect);
}
@Override protected void layoutChildren() {
final double width = getWidth();
double height = getHeight();
double top = getInsets().getTop();
double right = getInsets().getRight();
double left = getInsets().getLeft();
double bottom = getInsets().getBottom();
double contentWidth = width - left - right;
double contentHeight = height - top - bottom;
Node child = getManagedChildren().get(0);
layoutInArea(child, left, top,
contentWidth, contentHeight,
0, null,
HPos.LEFT,
VPos.TOP);
clipRect.setWidth(contentWidth);
clipRect.setHeight(contentHeight);
}
}
public static void main(String[] args) {
launch(args);
}
}
相關問題
相關問題
- 1. 蝕刻邊框(Win32)
- 2. 設計一個蝕刻邊框
- 3. 如何繪製JPanel在揮杆
- 4. 使用揮杆繪製箭頭
- 5. 如何繪製一個UILabel邊界
- 6. 是否有可能打開一個Jmenu按鈕單擊揮杆?
- 7. 覆蓋toString()揮杆類
- 8. 繪製邊框形狀javafx
- 9. 在JavaFX中繪製變換獨立的佈局邊界
- 10. 如何在WinForm上繪製蝕刻的3D線?
- 11. 這可能只顯示一個對象的邊界嗎?
- 12. 蝕刻在Matlab
- 13. 關閉一個閃屏在揮杆
- 14. 阻止整個揮杆的用戶界面 - 「對話式」
- 15. 問題與繪製PNG文件到揮杆GUI
- 16. 使用揮杆在文字中繪製虛線
- 17. scilab - 繪製邊界框
- 18. 有什麼方法可以在R中的一組點上繪製邊界嗎?
- 19. 單個java.awt.Rectangle可以用兩種不同的邊界顏色繪製嗎?
- 20. 繪製幾個國家ingnoring邊界
- 21. Java GUI - 不揮杆
- 22. UiStepper IOS7刪除邊界可能嗎?
- 23. 的JavaFX在揮杆例外「工具包未初始化」
- 24. 使用揮杆製作3D按鈕
- 25. Swing插件視覺揮杆類
- 26. 單擊兩個按鈕的揮杆
- 27. 我可以同時設置邊界左邊界和右邊界邊界嗎?
- 28. 基本的揮杆用戶界面在默認的
- 29. 蝕刻周圍的框
- 30. 我可以在序列圖中繪製邊界類(作爲接口)而不是控制器類嗎?