2017-07-05 6 views
0

温度データをプロットするためにこのアプリケーションのプログラミングを開始しました。画面のサイズが変更されると、キャンバスのサイズも変更されます。これは正しく初期化されますが、ウィンドウのサイズを変更したい場合、draw()メソッドはバインドされているstackpanesの高さの値に従って高さのサイズを変更しますが、幅を完全に無視します。リスナーは発砲もしません。これは私が非常に奇妙なことを見つける。また、StackPaneのminSizeを設定する必要があります。そうしないと、描画がまったく行われません。私はFXMLを使用していません。JavaFx Canvasの高さは、幅はあくまでサイズ変更されています

誰にもアイデアはありますか?

編集 InternetUnexplorerのソリューションで説明したように、setRight()からsetCenterに58行目を変更しました。しかし、私はまだそれがなぜそうなのか不思議だったので、私はいくつかの研究をしました。私はインターネットでこれを見つけた:

  • トップ/ボトムエリア:水平に拡大/縮小し、 変わらない高さを維持することができます。
  • 左/右領域:垂直方向に縮小/拡大し、長さを に変更しないでください。
  • センターエリア:両方向に縮小/拡大できます。ここで

http://o7planning.org/en/10629/javafx-borderpane-layout-tutorial

私のメインクラス:

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

public class main extends Application { 

    @Override 
    public void start(Stage mainStage) throws Exception { 
     TempViewerWindow view = new TempViewerWindow(); 
     ReadData controller = new ReadData(view); 
     controller.selectAll(); 

     mainStage.setScene(new Scene(view)); 
     //mainStage.setMinWidth(500); 
     //mainStage.setMinHeight(400); 
     mainStage.setTitle("Temperature Viewer"); 
     mainStage.show(); 
    } 

    public static void main(String[] args) { 

     launch(args); 

    } 

} 

そして、ここに私の見解クラス:とき

import javafx.scene.canvas.Canvas; 
import javafx.scene.canvas.GraphicsContext; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.StackPane; 
import javafx.scene.paint.Color; 

public class TempViewerWindow extends BorderPane { 

    public TableView<TempData> tableView; 
    public Canvas canvas; 
    public GraphicsContext gc; 
    public StackPane holder; 

    public TempViewerWindow() { 
     tableView = new TableView<>(); 
     TableColumn<TempData, String> col_date = new TableColumn<>("Date"); 
     TableColumn<TempData, Float> col_temperature = new TableColumn<>("Temperature"); 

     col_date.setCellValueFactory(e -> e.getValue() 
              .dateProperty()); 
     col_temperature.setCellValueFactory(e -> e.getValue() 
                .temperatureProperty() 
                .asObject()); 

     tableView.getColumns() 
       .addAll(col_date, col_temperature); 

     setLeft(tableView); 

     holder = new StackPane(); 
     holder.setMinSize(400, 400); // must be here for some reason 

     canvas = new Canvas(); 

     gc = canvas.getGraphicsContext2D(); 

     canvas.widthProperty() 
       .bind(holder.widthProperty() 
          .subtract(10)); 
     canvas.heightProperty() 
       .bind(holder.heightProperty() 
          .subtract(10)); 

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

     holder.getChildren() 
       .add(canvas); 

     setCenter(holder); //here was the bug 

    } 

    private void redraw(GraphicsContext gc) { 
     gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight()); 
     gc.setFill(Color.WHITE); 
     gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); 
     System.out.println("redraw!"); 

    } 

} 

答えて

0

あなたのキャンバスは、あなたのBorderPaneの右側に配置されていますそれを中央に置くべきです。

TempViewerWindowの行54をsetRight(holder)からsetCenter(holder)に変更すると、スケーリングが正しく機能します。

+0

ありがとうございます!それはそれを解決しました! – TheQuestioner

+0

@ fabianの答えはもう少し説明します。また、キャンバスの代わりにチャートを使用してデータをプロットすることを検討しましたか? – InternetUnexplorer

+0

私はちょうどチャートを見て、それを試してみましょう。キャンバスよりも私のニーズに合っているようです。しかしおそらく私はJavaFxの理解を深めるためにすべて自分でコード化するべきでしょうか? – TheQuestioner

0

holderの親としてBorderPaneを使用しています。 holderは、BorderPaneの右の子として使用されます。しかし、右/左の子は、望ましい幅にリサイズされ、頂点ノードと底辺ノードの間の高さを満たすようにサイズが変更されます。

javadoc参照)leftright子供たちは、好ましい幅にサイズ変更し、topbottomノード間の長さを延長します。

holdercenterとすると、幅は期待通りに調整されます。

また、TempViewerWindowの基本クラスとしてHBoxを使用すると、この種の動作を実現できます。

public TempViewerWindow() { 
    ... 
    this.getChildren().addAll(tableView, holder); 
    HBox.setHgrow(holder, Priority.ALWAYS); 
    HBox.setHgrow(tableView, Priority.NEVER); 
    this.setFillHeight(true); 
} 
+0

すてきな説明に感謝します!あなたの代わりに試してみます。 – TheQuestioner

関連する問題