2014-05-03 17 views
6

Sto lavorando alla GUI del mio editor di livelli che ho creato in JavaFX e voglio poter ridimensionare l'oggetto canvas nelle nuove dimensioni del riquadro diviso. Sembra che tutto ciò che è stato provato abbia fallito. Ciò include il passaggio dell'oggetto riquadro e l'utilizzo della larghezza direttamente, tramite listener di dimensioni di finestra e associazione della proprietà width e height a quella del riquadro diviso. Qualche idea. Questo è ciò che loos come prima un ridimensionamento:JavaFX - Ridimensiona tela quando lo schermo viene ridimensionato

enter image description here

E dopo un ridimensionamento:

enter image description here

Qualcuno hasve tutte le idee. Il codice per la classe è piuttosto esteso, ma verrà incluso il codice per il ridimensionamento.

public Canvas canvas; 
public String tabTitle; 
public VBox layout; 
public GraphicsContext g; 
public Core core; 

public CanvasTab(Core core, String tabTitle){ 
    this.core = core; 
    this.canvas = new Canvas(core.scene.getWidth() - 70, core.scene.getHeight() - 70); 
    layout = VBoxBuilder.create().spacing(0).padding(new Insets(10, 10, 10, 10)).children(canvas).build(); 

    this.g = canvas.getGraphicsContext2D(); 

    g.setFill(Color.BLACK); 
    g.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); 

    HBox.setHgrow(layout, Priority.ALWAYS); 

    this.setContent(layout); 
    this.setText(tabTitle); 

    canvas.widthProperty().bind(layout.widthProperty().subtract(20)); 
    canvas.heightProperty().bind(layout.heightProperty().subtract(20)); 
} 

public CanvasTab(Canvas canvas){ 
    this.canvas = canvas; 
} 
+1

L'area di disegno è (presumo) un ridimensionamento corretto, ma si riempie il rettangolo nero per la dimensione della tela quando viene creata la scheda di tela. Se vuoi usare una tela e vuoi ridimensionarla, probabilmente dovrai ridisegnare tutto (o almeno alcune cose) su un ridimensionamento. –

risposta

10

Come ha sottolineato James_D, è necessario ridisegnare il contenuto della tela durante il ridimensionamento. Questo può essere fatto con l'aggiunta di un listener per la tela proprietà larghezza e l'altezza come segue:

InvalidationListener listener = new InvalidationListener(){ 
    @Override 
    public void invalidated(Observable o) { 
     redraw();  
    }   
}); 
canvas.widthProperty().addListener(listener); 
canvas.heightProperty().addListener(listener); 

o in Java 8 utilizzando interfacce funzionali:

canvas.widthProperty().addListener(observable -> redraw()); 
canvas.heightProperty().addListener(observable -> redraw()); 

dove redraw() è il proprio metodo che apparirebbe così per il vostro esempio (disegnando un rettangolo nero:.

private void redraw() { 
    g.setFill(Color.BLACK); 
    g.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); 
} 
+1

Nella mia esperienza limitata, è necessario ottenere la larghezza della proprietàProperty e heightProperty, non il canvas: https://blog.idrsolutions.com/2012/11/adding-a-window-resize-listener-to-javafx-scene/ – bbarker

5

per effettuare una tela JavaFX ridimensionabile tutto ciò che deve essere fatto è sostituire le min/pref/metodi max Rendere ridimensionabile e implementare il metodo di ridimensionamento.

Con questo metodo non è necessario alcun ascoltatore di larghezza/altezza per attivare un nuovo aggiornamento. Inoltre, non è più necessario legare le dimensioni della larghezza e dell'altezza al contenitore.

public class ResizableCanvas extends Canvas { 

@Override 
public double minHeight(double width) 
{ 
    return 64; 
} 

@Override 
public double maxHeight(double width) 
{ 
    return 1000; 
} 

@Override 
public double prefHeight(double width) 
{ 
    return minHeight(width); 
} 

@Override 
public double minWidth(double height) 
{ 
    return 0; 
} 

@Override 
public double maxWidth(double height) 
{ 
    return 10000; 
} 

@Override 
public boolean isResizable() 
{ 
    return true; 
} 

@Override 
public void resize(double width, double height) 
{ 
    super.setWidth(width); 
    super.setHeight(height); 
    paint(); 
} 

noti che il metodo di ridimensionamento non può semplicemente chiamare Node.resize (larghezza, altezza), perché l'implementazione standard è effectivele vuoto.

+0

Questa risposta è d'oro! – GOXR3PLUS

Problemi correlati