2017-08-04 17 views
1

私はListViewをいくつか持っています。ラベルのwidthプロパティはListViewのwidthプロパティにバインドされていますが、リストビューに水平スクロールバーが表示されていることを意味します。私が望むのは、リストビューの下にスクロールバーを付けずにラベルを収めることです。私はラベルとリストビューの両方でさまざまなパディングとインセットの値を見てきましたが、私が見つけたものは誰もが原因ではありません(ほとんどがゼロです)。ここでJavaFXのListView内のラベルの縮尺方法

enter image description here

問題を示す例です。

import javafx.application.Application; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.ListView; 
import javafx.stage.Stage; 

public class ListViewScrollExample extends Application { 

    private ListView<Node> listView; 

    @Override 
    public void start(Stage stage) throws Exception { 
     listView = new ListView<>(); 
     addItem("Some quite long string to demonstrate the problem"); 

     Scene scene = new Scene(listView); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public void addItem(String item) { 
     Label label = new Label(item); 
     label.setWrapText(true); 
     label.maxWidthProperty().bind(listView.widthProperty()); 
     listView.getItems().add(label); 
    } 

    public static void main(String[] args){ 
     Application.launch(args); 
    } 

} 
+0

テキストの折り返しを許可する場合は、どのように幅を計算しますか?私はラベルが各行に1単語を表示するまでリストビューを縮小することができます。 – user1803551

+0

@ user1803551問題は、スクロールバーがListViewの下部に表示されることです。私は期待どおりラッピングが動作しますが、テキスト自体が表示されていなくてもラベル領域が横に広がっているようです – Janion

+0

スクロールバーを削除したいのですか? [this](https://stackoverflow.com/questions/12670137/how-to-hide-the-horizo​​ntal-scrollbar-of-a-listview-in-javafx)のように? – user1803551

答えて

3

default CSS fileListCell(現在のリリースでは行2316)にパディングを追加します。

.list-cell { 
    -fx-padding: 0.25em 0.583em 0.25em 0.583em; /* 3 7 3 7 */ 
} 

それは、一般的にListViewをバックアップデータとしてNodeインスタンスを使用することは悪い考えを:あなたは、この例ではStringを使用する必要がありますセルファクトリを使用して、必要に応じて構成された文字列を表示するラベルを作成します。以下のあなたの例のために働くようだ:

import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.scene.Scene; 
import javafx.scene.control.ContentDisplay; 
import javafx.scene.control.Label; 
import javafx.scene.control.ListCell; 
import javafx.scene.control.ListView; 
import javafx.stage.Stage; 

public class ListViewScrollExample extends Application { 

    private ListView<String> listView; 

    @Override 
    public void start(Stage stage) throws Exception { 
     listView = new ListView<>(); 
     listView.getItems().add("Some quite long string to demonstrate the problem"); 

     listView.setCellFactory(lv -> { 
      ListCell<String> cell = new ListCell<String>() { 

       private Label label = new Label(); 
       { 
        label.setWrapText(true); 
        label.maxWidthProperty().bind(Bindings.createDoubleBinding(
          () -> getWidth() - getPadding().getLeft() - getPadding().getRight() - 1, 
          widthProperty(), paddingProperty())); 
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
       } 

       @Override 
       protected void updateItem(String item, boolean empty) { 
        super.updateItem(item, empty); 
        if (empty) { 
         setGraphic(null); 
        } else { 
         label.setText(item); 
         setGraphic(label); 
        } 
       } 
      }; 
      return cell ; 
     }); 

     Scene scene = new Scene(listView); 
     stage.setScene(scene); 
     stage.show(); 
    } 


    public static void main(String[] args){ 
     Application.launch(args); 
    } 

} 

List view at default width List view at wider width List view at narrow width

ここ

私はへの文字列に設定されたラベルのテキストと、そのグラフィックとしてラベルを表示するリストセルを作成しました表示されます。セルのコンストラクタは、ラベルの最大幅をセルの幅にバインドし、パディングに必要なスペースを少なくします。 setContentDisplay(ContentDisplay.GRAPHIC_ONLY)の呼び出しが必要なように見えるので、セルはテキスト用のスペースを割り当てようとしません。

リストセルに直接テキストを設定し、セル上でsetWrapText(true)を呼び出して(これは結局、Labeledのサブクラスでもあります)、これを行うことができませんでした方法。

+0

それは、ありがとう、働く。私はそのメソッドを使用することを知らなかったでしょう – Janion

+0

私はバインディングでマイナス1を見つけましたが、setContentDisplay(ContentDisplay.GRAPHIC_ONLY)の呼び出しは不要でした – Janion

-1

私は、問題をレプリケートできませんでしたが、あなたはあなたがして画面を変更する必要がある任意の画素数に2.0を変更することができ、次の代わりに、label.maxWidthProperty().bind(listView.widthProperty());

double i = Double.parseDouble(listView.widthProperty().toString()); 
label.setMaxWidth((i-2.0)); 

を試すことができます。

+2

私は、ラベルサイズを縮小するハードコードされた定数を避けようとしています。 また、なぜListView.widthProperty()。get()の代わりにDouble.parseDouble(listView.widthProperty()。toString())を使用しましたか? – Janion

+0

代わりにdouble.parseを使用する本当の理由はありませんが、それは私の心が最初に行ったところです。代わりに 'label.setMaxWidth(listView.getPrefWidth());'を試すことができます。それはすべて同じことをすべきですが、値はわずかに異なる可能性があります。 –

+0

ハードコードされた量を縮小する場合は、同じバインディング方法を使用してください: 'label.maxWidthProperty()。bind(listView.widthProperty()。subtract(2.0));' –

関連する問題