2017-12-17 35 views
3

TableViewのカスタムサイズ変更ポリシーは、表示列の幅の合計が常にテーブル自体の幅と等しいという点でTableView.CONSTRAINED_RESIZE_POLICYに似ています。列のヘッダーの分割線をダブルクリックしたときにCustomResizePolicyがトリガーされない

テーブルのサイズを変更するか、ユーザーが列をドラッグすると、サイズ変更ポリシーが呼び出され、列のサイズが適切に変更されます。

ただし、表のヘッダー内の分割線の1つをダブルクリックすると(列の内容を「縮小ラップ」する)、カスタムサイズ変更ポリシーはトリガされません。

結果として、列の幅の合計がテーブルの幅よりも大きくても小さくても、それは良くありません。

これらのダブルクリックを検出して、後でCustomResizePolicyでコールをトリガーするにはどうすればよいですか?

import java.util.Locale; 
import javafx.application.Application; 
import javafx.beans.property.SimpleObjectProperty; 
import javafx.collections.FXCollections; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class CustomResizeExample extends Application { 

    @SuppressWarnings("unchecked") 
    private Parent getContent() { 
     TableView <Locale> table = new TableView <>(FXCollections.observableArrayList(Locale.getAvailableLocales())); 
     TableColumn <Locale, String> countryCode = new TableColumn <>("CountryCode"); 
     countryCode.setCellValueFactory(new PropertyValueFactory <>("country")); 
     TableColumn <Locale, String> language = new TableColumn <>("Language"); 
     language.setCellValueFactory(new PropertyValueFactory <>("language")); 
     table.getColumns().addAll(countryCode, language); 

     TableColumn <Locale, Locale> local = new TableColumn <>("Locale"); 
     local.setCellValueFactory(c -> new SimpleObjectProperty <>(c.getValue())); 

     table.getColumns().addAll(local); 
     table.setColumnResizePolicy(new CustomResizePolicy()); 

     BorderPane pane = new BorderPane(table); 
     return pane; 
    } 
    @Override 
    public void start (Stage stage) throws Exception { 
     stage.setScene(new Scene(getContent(), 800, 400)); 
     stage.show(); 
    } 

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

} 

@SuppressWarnings ("rawtypes") 
class CustomResizePolicy implements Callback <TableView.ResizeFeatures, Boolean> { 
    @Override 
    public Boolean call (TableView.ResizeFeatures feature) { 

     System.out.println ("Called"); //This does not print when the divider is double-clicked. 

     return TableView.CONSTRAINED_RESIZE_POLICY.call(feature); 
    } 
} 

答えて

3

これはTableViewSkinのバグである:ここでは

CustomResizePolicyへの呼び出しにはなりませんダブルクリックを示した実施例です。

Java 8では、列セパレータをダブルクリックして呼び出す方法resizeColumnToFitContentは、TableViewresizeColumnを呼び出しません。その結果、レイアウトが正しく更新されません。これを観察するには、幅に合わせる列のサイズを変更するだけで十分です。実際には、fit-to-widthを繰り返すと、幅が実際の幅に近づきます。同じ列に複数回並んでサイズを調整してください(他の列でこれを行うと、動作がリセットされます)。

私は良い回避策を見つける時間がありませんでした。改善のいくつかのうわべだけをTableViewSkinとオーバーライドresizeColumnToFitContentをサブクラス化することであります:それは正しい修正を見つけるためにいくつかのより多くの研究がかかります

class CustomTableSkin<T> extends TableViewSkin<T> { 

    public CustomTableSkin(TableView<T> tableView) { 
     super(tableView); 
     i = tableView.getColumns().size() + 1; 
    } 

    private int i; 

    @Override 
    protected void resizeColumnToFitContent(TableColumn<T, ?> tc, int maxRows) { 
     double before = tc.getWidth(); 
     super.resizeColumnToFitContent(tc, maxRows); 
     double now = tc.getWidth(); 
     double diff = before - now; 
     i--; 
     if (i >= 0) 
      resizeColumn(tc, -diff); 
    } 
} 

いくつかのケースではresizeColumnヘルプへの呼び出しのほか、しかし。

Java 9ではスキニング実装が変更されましたが、問題はまだ存在していると思います。

+1

私はJava 8でCustomTableSkinを見つけることができません。あなたの投稿を誤解しましたか? – JoshuaD

+0

@JoshuaD 'CustomTableSkin'がコードで定義されています。 – user1803551

+1

Er。私は私のjava - openjdkバージョン "1.8.0_151"で "TableViewSkin"を見つけることができないということです。私が "import com.sun.javafx.scene.control.TableViewSkin"しようとすると、私は "インポートを解決することはできません取得する。 – JoshuaD

関連する問題