温度データをプロットするためにこのアプリケーションのプログラミングを開始しました。画面のサイズが変更されると、キャンバスのサイズも変更されます。これは正しく初期化されますが、ウィンドウのサイズを変更したい場合、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!");
}
}
ありがとうございます!それはそれを解決しました! – TheQuestioner
@ fabianの答えはもう少し説明します。また、キャンバスの代わりにチャートを使用してデータをプロットすることを検討しましたか? – InternetUnexplorer
私はちょうどチャートを見て、それを試してみましょう。キャンバスよりも私のニーズに合っているようです。しかしおそらく私はJavaFxの理解を深めるためにすべて自分でコード化するべきでしょうか? – TheQuestioner