6

私は JavaFX 2 を初めて使用し、ComboBox と ListView のデフォルトの幅について混乱しています。ComboBox の幅が広くなり、「プロンプト テキスト」というテキストが完全に表示されるようになります。ListView の場合は、必要なだけ幅が狭くなることが期待されます。以下のコードとスクリーンショット。

1) ComboBox と Listview の両方が必要な幅にサイズ変更されるようにするにはどうすればよいですか?

2)両方のコントロールを同じ幅にする方法(したがって、両方の幅の最大値)、両方の幅の間に何らかのリンクを作成することは可能ですか? 特に FXML のエレガントなソリューションを探しています。

ヒントをありがとう!

@Override
public void start(Stage primaryStage) {
    ComboBox<String> comboBox = new ComboBox<String>();
    comboBox.setPromptText("the prompt text");
    ObservableList<String> items = FXCollections.observableArrayList();
    items.addAll("item 1", "item 2");
    comboBox.setItems(items);

    ListView<String> list = new ListView<String>();
    ObservableList<String> items2 =FXCollections.observableArrayList (
        "blue", "red");
    list.setItems(items2);

    VBox vBox = new VBox();
    vBox.getChildren().addAll(comboBox, list);

    primaryStage.setScene(new Scene(vBox, 200, 300));
    primaryStage.show();
}

ここに画像の説明を入力

4

2 に答える 2

10

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の推奨幅の計算はまもなく修正されると思います。

于 2012-05-07T20:48:00.920 に答える
0

1) を設定してみてくださいminWidth(x), prefWidth(x), maxWidth(x)。それは役に立ちますが、それが良い決断かどうかはわかりません。

2)void bind(ObservableValue<? extends Number> observable);バインディング フレームワークのメソッドを使用します。そのような場合のために開発されました。元:

someProperty.bind(otherProperty);

また、双方向バインディングを使用してそれらをリンクすることもできます。

于 2012-05-07T20:27:24.573 に答える