Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当列';s标题';双击s分隔符_Java_Javafx_Tableview_Javafx 8_Javafx Tableview - Fatal编程技术网

Java 当列';s标题';双击s分隔符

Java 当列';s标题';双击s分隔符,java,javafx,tableview,javafx-8,javafx-tableview,Java,Javafx,Tableview,Javafx 8,Javafx Tableview,我为TableView编写了一个自定义调整大小策略,它类似于TableView。受约束的调整大小策略,因为可见列的总宽度始终等于表本身的宽度 无论何时,只要通过正在调整大小的表或用户拖动列来调整列的大小,都会调用调整大小策略,并相应地调整列的大小 但是,当双击表标题中的一个分隔符(以“收缩包装”列的内容)时,不会触发自定义调整大小策略 因此,列的总宽度可能大于或小于表的宽度,这是不好的 我如何检测到这些双击并使我的CustomResizePolicy在之后触发调用 下面是一个工作示例,显示双击不

我为
TableView
编写了一个自定义调整大小策略,它类似于
TableView。受约束的调整大小策略
,因为可见列的总宽度始终等于表本身的宽度

无论何时,只要通过正在调整大小的表或用户拖动列来调整列的大小,都会调用调整大小策略,并相应地调整列的大小

但是,当双击表标题中的一个分隔符(以“收缩包装”列的内容)时,不会触发自定义调整大小策略

因此,列的总宽度可能大于或小于表的宽度,这是不好的

我如何检测到这些双击并使我的
CustomResizePolicy
在之后触发调用

下面是一个工作示例,显示双击不会导致调用
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 );
    }
}
import java.util.Locale;
导入javafx.application.application;
导入javafx.beans.property.SimpleObject属性;
导入javafx.collections.FXCollections;
导入javafx.scene.Parent;
导入javafx.scene.scene;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableView;
导入javafx.scene.control.cell.PropertyValueFactory;
导入javafx.scene.layout.BorderPane;
导入javafx.stage.stage;
导入javafx.util.Callback;
公共类CustomResizeExample扩展了应用程序{
@抑制警告(“未选中”)
私有父级getContent(){
TableView table=newtableview(FXCollections.observearraylist(Locale.getavailablecales());
TableColumn countryCode=新的TableColumn(“countryCode”);
countryCode.setCellValueFactory(新属性ValueFactory(“国家”);
TableColumn语言=新的TableColumn(“语言”);
语言。setCellValueFactory(新属性ValueFactory(“语言”);
table.getColumns().addAll(国家代码,语言);
TableColumn local=新的TableColumn(“区域设置”);
local.setCellValueFactory(c->new SimpleObject属性(c.getValue());
table.getColumns().addAll(本地);
table.setColumnResizePolicy(新的CustomResizePolicy());
BorderPane=新的BorderPane(表格);
返回窗格;
}
@凌驾
public void start(Stage)引发异常{
stage.setScene(新场景(getContent(),800400));
stage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}
@抑制警告(“原始类型”)
类CustomResizePolicy实现回调{
@凌驾
公共布尔调用(TableView.ResizeFeatures功能){
System.out.println(“调用”);//双击分隔符时不会打印。
返回TableView.constrated\u RESIZE\u POLICY.call(功能);
}
}

这是
TableViewSkin
中的一个错误

在Java 8中,通过双击列分隔符调用的方法
resizeColumntOffitContent
,在
TableView
中不调用
resizeColumn
。结果是布局未正确更新。您可以尝试调整“适合宽度”列的大小来观察这一点。事实上,反复拟合宽度将使宽度越来越接近其实际宽度。尝试在同一列的同一行中调整几次大小(对其他列执行此操作将重置行为)

我没有时间找到一个好的解决办法。通过子类化
TableViewSkin
并重写
ResizeColumntOffitContent
,似乎有一些改进:

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);
    }
}
class CustomTableSkin扩展了TableViewSkin{
公共自定义表皮肤(TableView TableView){
超级(桌面视图);
i=tableView.getColumns().size()+1;
}
私人互联网i;
@凌驾
受保护的void resizeColumntOffitContent(TableColumn tc,int maxRows){
double before=tc.getWidth();
super.resizeColumntOffitContent(tc、maxRows);
double now=tc.getWidth();
双差=以前-现在;
我--;
如果(i>=0)
调整柱尺寸(tc,-diff);
}
}
在某些情况下,添加对
resizeColumn
的调用会有所帮助,但需要更多的研究才能找到正确的修复方法


Java 9改变了蒙皮实现,但我相信问题仍然存在。

我无法在Java 8中找到CustomTableSkin。我误解你的帖子了吗?呃。我的意思是我在java——openjdk版本“1.8.0_151”中找不到“TableViewSkin”。当我尝试“导入com.sun.javafx.scene.control.TableViewSkin”时,我得到“导入无法解决。@JoshuaD Google应该会帮你解决这个问题。我在发布之前用谷歌搜索了两次。我会再试第三次。同时,如果你有答案,将其编辑到你的帖子中会很有帮助,因为我相信我不会是唯一遇到这个问题的人,我保证不清楚如何使用你提出的解决方案。我正在查看javafx 8 javadoc,但我没有看到它:,