2012-10-25 24 views
13

Tôi có một cảnh đơn giản với mã này:JavaFX 2 và css pseudo-classes: thiết lập các thuộc tính hover trong phương pháp setStyle

scene.getStylesheets().add("packagename/testcss.css"); 

Và testcss.css của tôi là:

.button { 
    -fx-background-color: #DDFFA4; 
} 

.button:hover { 
    -fx-background-color: #9ACD32; 
} 

gì tôi đạt được là hiệu ứng tốt đẹp được gọi là di chuột khi trong các ứng dụng web.

enter image description here ... enter image description here

HỎI
Làm thế nào tôi có thể đạt được tác dụng tương tự nhưng không có một file css riêng biệt, chỉ cần thông qua phương thức setStyle của Button của tôi?
Vấn đề là setStyle chỉ chấp nhận định nghĩa kiểu và bỏ chọn bộ chọn.

button.setStyle("-fx-background-color: #DDFFA4;"); 

Bộ chọn, trong trường hợp di chuột của tôi là pseudo-class:

.button:hover 

nhưng nơi nào tôi có thể thiết lập nó?

Hơn nữa, javadoc là rõ ràng trong không bao gồm bộ chọn từ đối số phương pháp setStyle:

Lưu ý rằng, giống như các thuộc tính style HTML, biến này chứa phong cách thuộc tính và các giá trị và không phải là phần chọn của quy tắc kiểu.

Trả lời

26

Như bạn lưu ý trong câu hỏi của bạn, như của JavaFX 2.2, kính giả css không được hiển thị như một phần của API công cộng mà bạn có thể sử dụng để thao tác theo kiểu bên trong mã Java.

Nếu bạn muốn thay đổi thuộc tính kiểu từ mã Java mà không sử dụng biểu định kiểu, bạn cần đặt kiểu dựa trên sự kiện hoặc danh sách thay đổi. Có một vài lựa chọn trong mẫu dưới đây.

import javafx.application.Application; 
import javafx.beans.binding.*; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.event.EventHandler; 
import javafx.geometry.Pos; 
import javafx.scene.*; 
import javafx.scene.control.Button; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.*; 
import javafx.stage.Stage; 

/** Changing button styles on hover without a css stylesheet. */ 
public class ButtonBackgroundChanger extends Application { 
    private static final String STANDARD_BUTTON_STYLE = "-fx-background-color: #DDFFA4;"; 
    private static final String HOVERED_BUTTON_STYLE = "-fx-background-color: #9ACD32;"; 

    public static void main(String[] args) throws Exception { launch(args); } 
    @Override public void start(final Stage stage) throws Exception { 
    Button configure = new Button("Configure"); 
    changeBackgroundOnHoverUsingBinding(configure); 
    Button update = new Button("Update"); 
    changeBackgroundOnHoverUsingEvents(update); 

    VBox layout = new VBox(10); 
    layout.setAlignment(Pos.CENTER); 
    layout.setStyle("-fx-padding: 10;"); 
    layout.getChildren().addAll(configure, update); 
    stage.setScene(new Scene(layout)); 
    stage.show(); 
    } 

    private void changeBackgroundOnHoverUsingBinding(Node node) { 
    node.styleProperty().bind(
     Bindings 
     .when(node.hoverProperty()) 
      .then(
      new SimpleStringProperty(HOVERED_BUTTON_STYLE) 
     ) 
      .otherwise(
      new SimpleStringProperty(STANDARD_BUTTON_STYLE) 
     ) 
    ); 
    } 

    public void changeBackgroundOnHoverUsingEvents(final Node node) { 
    node.setStyle(STANDARD_BUTTON_STYLE); 
    node.setOnMouseEntered(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
     node.setStyle(HOVERED_BUTTON_STYLE); 
     } 
    }); 
    node.setOnMouseExited(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent mouseEvent) { 
     node.setStyle(STANDARD_BUTTON_STYLE); 
     } 
    }); 
    }  
} 

tôi chỉ thực sự làm điều đó trong mã chứ không phải là một kiểu nếu màu sắc cần thiết để được thực sự năng động sử dụng lập stylesheets với màu sắc được xác định trước và phong cách có vấn đề, hoặc nếu có một số lo ngại khác để sử dụng stylesheets css.

Trong JavaFX 8, có một API công khai cho phép bạn (nếu bạn muốn) đến manipulate Region background colors without use of CSS.

chương trình mẫu đầu ra (với nút Update di chuột):

sample program output

+0

+1 về tính đầy đủ của câu trả lời với cả sáng tạo (ràng buộc dựa) và truyền thống (sự kiện có trụ sở) giải pháp. Điều thú vị là thực tế của nhóm thành changeBackgroundOnHoverUsingEvents cả cài đặt sự kiện và khởi tạo theo kiểu chuẩn, theo cách này chúng tôi có một điểm cấu hình cho tiện ích, giảm nguy cơ sửa đổi không đồng nhất và làm nổi bật giải pháp dựa trên sự kiện đó. khởi tạo. Phương pháp này cũng có thể được xem như là một bộ khởi tạo, với một số tên như "initButtonStyle". – AgostinoX

+0

Xin chào Jewelea, bạn đã đề cập rằng JavaFX 8 cho phép một số sửa đổi. Chúng ta có thể có một liên kết hoặc một ví dụ :).Nguyên nhân câu hỏi là thực sự cũ và cần một chút cập nhật trong phần này. – GOXR3PLUS

+0

Đã cập nhật câu trả lời để liên kết tới API nền JavaFX 8. – jewelsea

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