2)両方のコントロールを同じ幅(したがって、両方の幅の最大値)にする方法、両方の幅の間に何らかのリンクを作成することは可能ですか?私は特にFXMLの洗練されたソリューションを探しています。
デフォルトでは、ListViewのmaxWidthは無制限のように見えますが、ComboBoxのmaxWidthは、最初のアイテムリストの幅に固定されています。これらのコントロールの幅を同じにするには、レイアウトマネージャーに配置して(VBoxと同じように)、コンボボックスのmaxWidthのクランプを解除するのが最も簡単な方法です。
コードでは、これを行うことができます:
comboBox.setMaxWidth(Double.MAX_VALUE);
FXMLで、次の属性定義をComboBox要素に追加します。
maxWidth="Infinity"
ジョングレイのバインディングソリューションを使用できますが、上記の方がエレガントだと思います。
1)ComboBoxとListviewの両方が必要な幅にサイズ設定されていることをどのように実現できますか?
ここであなたが求めているのは、コンボボックスとリストビューが必要なだけのスペースを占有し、それ以上は占有しないようにする方法だと思います。これは少し注意が必要だと思いますが、JavaFXプラットフォームはこれをあまりサポートしていません。
リストボックスのサイズを必要最小限に固定するためのサンプルコードを次に示します。
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.*;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListView;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.stage.Stage;
public class GridControlWidths extends Application {
public static void main(String[] args) throws Exception { launch(args); }
@Override public void start(Stage stage) {
ComboBox<String> comboBox = new ComboBox<String>(FXCollections.observableArrayList("item 1", "item 2"));
comboBox.setPromptText("the prompt text");
ListView<String> list = new ListView<String>(FXCollections.observableArrayList ("blue", "red"));
// layout the controls in a grid with appropriate constraints.
GridPane grid = new GridPane();
grid.add(comboBox, 0, 0);
grid.add(list, 0, 1);
grid.setVgrow(list, Priority.ALWAYS); // make the list grow vertically as much as possible
// unclamp the max width of the combo box.
comboBox.setMaxWidth(Double.MAX_VALUE);
// display the scene.
stage.setScene(new Scene(grid, 200, 300));
stage.show();
// set the prefWidth of the listview based on the list cells (allowing 8 pixels for padding of the cells).
double maxWidth = 0;
for (Node n: list.lookupAll(".text")) {
maxWidth = Math.max(maxWidth, n.getBoundsInParent().getWidth() + 8);
}
list.setPrefWidth(maxWidth);
}
}
FWIW、アイテムが少ない場合に推奨されるアプローチは、ComboBoxではなくListViewまたはChoiceBoxを使用するのではなく、VBoxにアイテムを配置することです。これにより、セルのイントロスペクションと更新を行う必要がなくなります。レイアウトマネージャーとコントロールが自動的に処理するため、常に推奨される幅。ListViewは、レイアウト幅を簡単に計算できない可能性のある数千の任意のサイズのアイテムを含むことができる仮想化リストの場合を処理するように最適化されています。そのため、デフォルトのコントロールサイズ設定動作が付属していると思います。可能な最小サイズにサイズ設定します。通常、ListViewを使用する場合は、上記の例のようにアイテムを内省するのではなく、listViewに適切なprefWidthを選択し、それをlistViewに設定します。
さらに、プロンプトテキストの一部がクリップされている画像は、(私には)JavaFXのバグのように見えます。この場合、ComboBoxプロンプトテキストがComboBoxよりも広い場合、ComboBoxコントロールの優先幅が正しく計算されません。アイテムテキスト。ComboBoxは現在まったく新しいコントロールであり、JavaFXコントロールの以前のビルドでこの種の問題が発生し、修正されたため、ComboBoxの推奨幅の計算はまもなく修正されると思います。