2013-06-25 34 views
10

Tôi đã cố gắng thực hiện chuyển tiếp mở rộng cho một giai đoạn JavaFX để thay thế Scene hiện tại (trong trường hợp này là khung đăng nhập) cho cửa sổ chính của ứng dụng.
Khi điều này xảy ra, vì cảnh mới lớn hơn, các cửa sổ được kích hoạt lại một cách đột ngột một cách không thanh lịch.Làm cách nào để tạo hoạt ảnh Thay đổi kích thước cho giai đoạn JavaFX?

Có cách nào để thiết lập quá trình chuyển đổi tỷ lệ hoặc kích thước lại để thực hiện việc này để thay đổi kích thước của giai đoạn không?

đang liên quan:

InputStream is = null; 
try { 
    is = getClass().getResourceAsStream("/fxml/principal.fxml"); 
    Region pagina = (Region) cargadorFXML.load(is); 
    cargadorFXML.<ContenedorPrincipal>getController().setEscenario(escenario); 

    final Scene escena = new Scene(pagina, 900, 650); 

    escena.setFill(Color.TRANSPARENT); 
    escenario.setScene(escena); 
    escenario.sizeToScene(); 
    escenario.centerOnScreen(); 
    escenario.show(); 
} catch (IOException ex) { 
    // log "Unable to load the main application driver" 
    log.error("No fue posible cargar el controlador principal de la aplicación."); 
    log.catching(ex); 
} finally { 
    if (is != null) { 
     try { 
      is.close(); 
     } catch (IOException e) {} 
    } 
} 

Trả lời

5

Tôi thực sự thích ý tưởng của bạn vì vậy tôi cố gắng làm một chút gì đó. Tôi hy vọng điều này sẽ giúp bạn.

Tôi đã sử dụng Timer để thay đổi chiều rộng và chiều cao của mỗi 25ms một lần để hiển thị hoạt ảnh.

import java.util.Timer; 
import java.util.TimerTask; 

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class SmoothResize extends Application { 

    @Override 
    public void start(final Stage stage) throws Exception { 
     stage.setTitle("Area Chart Sample"); 
     Group root = new Group(); 
     Scene scene = new Scene(root, 250, 250); 
     stage.setResizable(false); 

     Timer animTimer = new Timer(); 
     animTimer.scheduleAtFixedRate(new TimerTask() { 
      int i=0; 

      @Override 
      public void run() { 
       if (i<100) { 
        stage.setWidth(stage.getWidth()+3); 
        stage.setHeight(stage.getHeight()+3); 
       } else { 
        this.cancel(); 
       } 
       i++; 
      } 

     }, 2000, 25); 

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

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Đó là cách hay để thực hiện. Tôi đã chọn tạo một Giai đoạn mới và sử dụng các hiệu ứng chuyển tiếp mờ dần giữa chúng để làm điều đó một cách đầy đủ nhưng đề xuất của bạn có vẻ tốt nên tôi sẽ thử nó ngay khi có thể. – fturizo

+3

Tốt hơn để sử dụng các tiện ích hoạt ảnh tích hợp sẵn của JavaFX chẳng hạn như Dòng thời gian thay vì Bộ hẹn giờ. Với bộ hẹn giờ bạn có một luồng khác và mã không phải là luồng an toàn trừ khi bạn bao bọc các cuộc gọi điều khiển biểu đồ giai đoạn hoặc cảnh trong các lời gọi Platform.runLater(). – jewelsea

2

Bạn cũng có thể sử dụng cơ chế hoạt ảnh với Timeline.
Một số ví dụ có sẵn here.

Vấn đề duy nhất là Stage không có thuộc tính chiều cao hoặc chiều rộng có thể ghi và bạn phải tự tạo tài khoản đó bằng chính bạn. Ví dụ bên dưới.

WritableValue<Double> writableHeight = new WritableValue<Double>() { 
    @Override 
    public Double getValue() { 
     return stage.getHeight(); 
    } 

    @Override 
    public void setValue(Double value) { 
     stage.setHeight(value); 
    } 
}; 
+0

Thay vì cung cấp các liên kết mẫu, bạn có thể trả lời câu hỏi bằng một ví dụ đầy đủ không? – ryvantage

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