3

JavaFX 2でListView(テキストが長すぎる場合は複数行)を自動ラップするにはどうすればよいですか?文字列にaを付ける\nと複数行になることはわかっていますが、内容が動的すぎます。

\nまたは、すべてのxyzピクセル長の後に文字列に配置する良い方法はありますか?

4

3 に答える 3

5

ListCell.graphicProperty()にTextAreaを配置できます。これは通常、リストセルにアイコンを設定するために使用されますが、任意のノードサブクラスに設定するのと同じくらい簡単です。

于 2012-12-13T22:15:46.300 に答える
4

これが私が最終的にそれをした方法の正確なコードです。

    ListView<String> messages = new ListView<>();
    messages.relocate(10, 210);
    messages.setPrefSize(this.getPrefWidth() - 20, this.getPrefHeight() - 250);
    messages.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
        @Override
        public ListCell<String> call(ListView<String> list) {
            final ListCell cell = new ListCell() {
                private Text text;

                @Override
                public void updateItem(Object item, boolean empty) {
                    super.updateItem(item, empty);
                    if (!isEmpty()) {
                        text = new Text(item.toString());
                        text.setWrappingWidth(messages.getPrefWidth());
                        setGraphic(text);
                    }
                }
            };

            return cell;
        }
    });
于 2012-12-14T21:34:29.867 に答える
1

TextAreaまたはなどの追加のコントロールを作成する必要はありませんText。とかそこらだけsetWrapText(true)で十分です。サイズ変更時に自動的に再ラップされます。Kotlinでの私の作業コードは次のとおりです。ListCell setPrefWidth(50.0)

    datasets.setCellFactory()
    {
        object : ListCell<Dataset>()
        {
            init
            {
                isWrapText = true
                prefWidth = 50.0
            }

            override fun updateItem(item: Dataset?, empty: Boolean)
            {
                super.updateItem(item, empty)

                text = item?.toString()
            }
        }
    }

ちなみに、これは私がキャメルケースの単語を正しくラップする方法です:

replace(Regex("(?<=\\p{javaLowerCase})(?=\\p{javaUpperCase})|(?<=[_.])"), "\u2028")

これは、 javaFX\u2028が尊重するUnicodeのソフト改行文字です。

于 2018-10-02T11:39:23.870 に答える