2014-06-12 31 views
1

在PySide中,您可以覆蓋QWidgetpaintEvent()方法來控制如何在屏幕上繪製小部件。 JavaFX中是否有與Node等效的內容?JavaFX中的自定義節點繪畫


在上下文中:我需要一種方法來在屏幕上顯示自定義圖像格式。不斷轉換我的格式和JavaFX的Image,所以我可以顯示它在ImageView對我來說太慢,除了變得更加混亂。

我看過ImageView.javaCanvas.java,但沒有運氣。 ImageView正在使用CSS,並且Canvas似乎正在採用已棄用的impl_方法,對此我找不到任何文檔。

謝謝!

+1

我不知道你的意思是「'ImageView'正在使用css」。您可以使用['WritableImage'](http://docs.oracle.com/javase/8/javafx/api/javafx/scene/image/WritableImage.html)作爲提供給「ImageView」的圖像,或者使用['Canvas'](http://docs.oracle.com/javase/8/javafx/api/javafx/scene/canvas/Canvas.html)及其[[GraphicsContext]](http:// docs。 oracle.com/javase/8/javafx/api/javafx/scene/canvas/GraphicsContext.html)。 'GraphicsContext'有很多用於繪製圖像的公共API。 –

+1

什麼是圖像格式? – Mansueli

+0

@James_D @Kyllopardiun我沒有讀得太深,但似乎'ImageView'通過'-fx-image' CSS屬性顯示自己的圖像,但實際的繪畫是在其他地方完成的。它可能在'impl_'方法之一中,但沒有文檔我無法理解它們。我有一個代表圖像數據的「int」數組。這是我正在編寫的圖像編輯器;我可以更新圖像視圖以反映圖像數據更改的速度是一個問題,這就是爲什麼我不希望在兩種格式之間轉換的原因。 – sorbet

回答

0

一般來說,JavaFX中的繪畫機制已經轉向更基於事件的方法。要遵循JavaFX方式,您應該查看TimelineAnimationTimer,並且只在實際圖像數據更改時更新顯示。

但是,你可以使用舊的方式擺在JavaFX中,如果你喜歡:

public class MyPane extends Pane { 
    private final Canvas canvas; 

    public MyPane() { 
     canvas = new Canvas(getWidth(), getHeight()); 
     getChildren().add(canvas); 
     widthProperty().addListener(e -> canvas.setWidth(getWidth())); 
     heightProperty().addListener(e -> canvas.setHeight(getHeight())); 
    } 

    @Override 
    protected void layoutChildren() { 
     super.layoutChildren(); 

     GraphicsContext gc = canvas.getGraphicsContext2D(); 

     gc.clearRect(0, 0, getWidth(), getHeight()); 

     gc.setFill(Color.RED); 
     gc.fillRect(10, 10, getWidth() - 20, getHeight() - 20); 

     // Paint your custom image here: 
     gc.drawImage(someImage, 0, 0); 
    } 
} 

上面的代碼將是這個Swing代碼等價:

public class MyPanel extends JPanel { 
    private static final long serialVersionUID = -969772195113348076L; 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     g.clearRect(0, 0, getWidth(), getHeight()); 

     g.setColor(java.awt.Color.RED); 
     g.fillRect(10, 10, getWidth() - 20, getHeight() - 20); 

     // Paint your custom image here: 
     g.drawImage(someImage, 0, 0, null); 
    } 
} 
+0

這會將整個畫布保留在內存中,而不是像'paintComponent' – Dims