2015-02-09 27 views
24

Tôi đang tìm cách tạo kiểu Hộp thoại JavaFX mặc định (javafx.scene.control.Dialog).Tạo kiểu Hộp thoại JavaFX mặc định

Tôi đã cố gắng lấy Hộp thoại và thêm biểu định kiểu, nhưng nó chỉ bao gồm một phần nhỏ của hộp thoại. Tôi chỉ muốn tạo kiểu với một tệp css bên ngoài và không thêm styleClasses vào mã. Điều này sẽ trông lộn xộn (tiêu đề, nội dung, nội dung của riêng nội dung và hơn thế nữa ..)

Tôi googled đã rất nhiều và chỉ tìm thấy ví dụ cho ControlsFX, nhưng kể từ jdk8_40 JavaFX có Dialogs riêng của nó bây giờ tôi sử dụng.

Mọi đề xuất?

Edit:

Kể từ José Pereda posted giải pháp i tạo dialog.css của riêng tôi. Tôi sẽ đăng nó ở đây vì nó bao gồm toàn bộ hộp thoại và có thể ai đó muốn sao chép & dán nó. Lưu ý .dialog-pane đã là một tên styleClass đã cho nên bạn không cần phải áp dụng riêng của mình. Tất nhiên, Josés là chi tiết tốt hơn.

.dialog-pane { 
    -fx-background-color: black; 
} 

.dialog-pane .label { 
    -fx-text-fill: white; 
} 

.dialog-pane:header .header-panel { 
    -fx-background-color: black; 
} 

.dialog-pane:header .header-panel .label { 
    -fx-font-style: italic; 
    -fx-font-size: 2em; 
} 

Trả lời

38

Bạn có thể tạo kiểu hộp thoại của bạn với tập tin css riêng bạn, nhưng cho rằng bạn cần phải đi vào xem xét rằng hộp thoại là trong thực tế, một giai đoạn mới, với một cảnh mới, và các nút gốc là một trường hợp DialogPane .

Vì vậy, một khi bạn tạo ra một số ví dụ thoại:

@Override 
public void start(Stage primaryStage) {   
    Alert alert = new Alert(AlertType.CONFIRMATION); 
    alert.setTitle("Confirmation Dialog"); 
    alert.setHeaderText("This is a Custom Confirmation Dialog"); 
    alert.setContentText("We override the style classes of the dialog"); 
    ... 
} 

bạn có thể truy cập vào cửa sổ hộp thoại của nó và thêm tấm phong cách riêng của bạn và lớp chọn của riêng bạn:

DialogPane dialogPane = alert.getDialogPane(); 
dialogPane.getStylesheets().add(
    getClass().getResource("myDialogs.css").toExternalForm()); 
dialogPane.getStyleClass().add("myDialog"); 

Bây giờ lừa là biết tất cả các quy tắc một tờ kiểu dáng Dialog đã được triển khai theo mặc định.

Và đó là một nhiệm vụ khó khăn ... vì chúng không có trong tệp modena.css, cũng như đối với tất cả các điều khiển thông thường. Ngược lại, chúng được tìm thấy trong tệp modena.bss, một tệp nhị phân nằm trong jfxrt.jar trong các gói riêng tư.

Sau khi một số digging tôi đã quản lý để có được những quy tắc, vì vậy tập tin tùy chỉnh myDialogs.css của bạn sẽ trông giống như thế này:

.myDialog{ 
    -fx-background-color: #f9d900; 
} 
.myDialog > *.button-bar > *.container{ 
    -fx-background-color: #a9e200; 
} 
.myDialog > *.label.content{ 
    -fx-font-size: 14px; 
    -fx-font-weight: bold; 
} 
.myDialog:header *.header-panel{ 
    -fx-background-color: #a59c31; 
} 
.myDialog:header *.header-panel *.label{ 
    -fx-font-size: 18px; 
    -fx-font-style: italic; 
    -fx-fill: #292929; 
} 

Và bạn sẽ có hộp thoại theo kiểu của bạn:

Styled dialog

Lưu ý rằng là một tệp bss theo gói riêng tư, các bộ chọn này có thể thay đổi mà không cần thông báo trong các bản phát hành trong tương lai.

EDIT

Tôi vừa mới phát hiện ra rằng bộ chọn .dialog-pane đã là một phần của modena.css trong 8u40 cuối cùng early versions, vì vậy bạn có thể tìm thấy tất cả các selectors và các quy tắc áp dụng cho các cửa sổ hộp thoại đó.

+0

Tôi đã tình cờ gặp một bài đăng khác của bạn nhưng nghĩ rằng nó không liên quan đến Hộp thoại JavaFx vì tên kiểu chữ "tùy chỉnh". Dù khi tôi đã thử ví dụ của bạn đầu tiên, nó đã không làm việc nhưng sau đó tôi nhận ra rằng im bằng cách sử dụng jdk8_u31. Bây giờ với 8_40 nó hoạt động. Cảm ơn vì điều đó. Nhưng tôi tự hỏi tại sao tôi đã có Dialog trong u31, bởi vì tôi đọc ở khắp mọi nơi nó chỉ có sẵn từ u40 .. bất kỳ ý tưởng? – Timo

+1

Tôi vừa sửa câu trả lời của mình, vì modena.css đã bao gồm bộ chọn '.dialog-pane' trong 8u40 ea mới nhất. Bài viết khác của tôi liên quan đến [openjfx-dialogs] (https://bitbucket.org/controlsfx/openjfx-dialogs), dự án inbetween được trích xuất từ ​​ControlsFX, hợp lệ cho các phiên bản 8u20, 8u25 và 8u31. –

+0

Cảm ơn câu trả lời này, nó rất hữu ích! Tuy nhiên, tôi đã nhận thấy rằng việc sử dụng ': header' không hoạt động nữa, vì vậy tôi chỉ sử dụng' .myDialog .header-panel', hoạt động hoàn hảo. Tôi cũng đang sử dụng 8u40 .. – bashoogzaad

Các vấn đề liên quan