Model view controller 在JavaFX中创建动态自定义控件

Model view controller 在JavaFX中创建动态自定义控件,model-view-controller,javafx,custom-controls,Model View Controller,Javafx,Custom Controls,我的目标是代表这一点: 这是一个网格窗格,共有3列: 第一列包含一个标签,它是我刚刚打开的文件的名称 第二列包含表示刷新率的TextField 第三列包含一个复选框和2个按钮 如果用户打开一个文件,我应该在这个自定义控件中添加一行,如果没有打开文件,GridPane为空。 我用以下代码开始我的代码: 控制类 package view.component.fileView; import javafx.scene.control.Control; import javafx.scene.c

我的目标是代表这一点:

这是一个网格窗格,共有3列:

  • 第一列包含一个
    标签
    ,它是我刚刚打开的文件的名称
  • 第二列包含表示刷新率的
    TextField
  • 第三列包含一个
    复选框
    和2个
    按钮
如果用户打开一个文件,我应该在这个自定义控件中添加一行,如果没有打开文件,
GridPane
为空。 我用以下代码开始我的代码:

控制类

package view.component.fileView;

import javafx.scene.control.Control;
import javafx.scene.control.Skin;

public class FileViewGrid extends Control{

    @Override
    protected Skin<?> createDefaultSkin(){
        return new FileViewGridSkin(this);
    }
}
package view.component.fileView;

import javafx.scene.control.SkinBase;
import javafx.scene.layout.GridPane;

public class FileViewGridSkin extends SkinBase<FileViewGrid>{

    protected FileViewGridSkin(FileViewGrid control) {
        super(control);
        // TODO Auto-generated constructor stub
    }
}
package view.component.fileView;
导入javafx.scene.control.control;
导入javafx.scene.control.Skin;
公共类FileViewGrid扩展了控件{
@凌驾
受保护的皮肤createDefaultSkin(){
返回新的FileViewGridSkin(此);
}
}
皮肤等级

package view.component.fileView;

import javafx.scene.control.Control;
import javafx.scene.control.Skin;

public class FileViewGrid extends Control{

    @Override
    protected Skin<?> createDefaultSkin(){
        return new FileViewGridSkin(this);
    }
}
package view.component.fileView;

import javafx.scene.control.SkinBase;
import javafx.scene.layout.GridPane;

public class FileViewGridSkin extends SkinBase<FileViewGrid>{

    protected FileViewGridSkin(FileViewGrid control) {
        super(control);
        // TODO Auto-generated constructor stub
    }
}
package view.component.fileView;
导入javafx.scene.control.SkinBase;
导入javafx.scene.layout.GridPane;
公共类FileViewGridSkin扩展了SkinBase{
受保护的FileViewGridSkin(FileViewGrid控件){
超级(控制);
//TODO自动生成的构造函数存根
}
}
但是,动态添加行的事实让我感到困惑。如果这是静态的,我将在我的皮肤类中添加我的所有元素,并在控制类中添加它们的行为,但现在我觉得这似乎不可能

这样做对吗?我应该使用FXML方法创建自定义控件吗

这是否表示ListView的单元格

如果是,你有一个好的开始。 秘密是玩和玩

在你的控制下,你必须把你想暴露的东西放在外面。例如,Textfield具有textProperty()

在您的情况下,您可能希望公开将在ListView中的对象列表

您的控制将类似于:

package view.component.fileView;

import javafx.scene.control.Control;
import javafx.scene.control.Skin;

public class FileViewGrid extends Control{

ListProperty<YourBean> list = new SimpleListProperty(FXCollection.emptyObservableList())

    @Override
    protected Skin<?> createDefaultSkin(){
        return new FileViewGridSkin(this);
    }
}
这对所有类型的组件都是一样的

此外,您还可以签出包含大量示例的项目的

这是否表示ListView的单元格

如果是,你有一个好的开始。 秘密是玩和玩

在你的控制下,你必须把你想暴露的东西放在外面。例如,Textfield具有textProperty()

在您的情况下,您可能希望公开将在ListView中的对象列表

您的控制将类似于:

package view.component.fileView;

import javafx.scene.control.Control;
import javafx.scene.control.Skin;

public class FileViewGrid extends Control{

ListProperty<YourBean> list = new SimpleListProperty(FXCollection.emptyObservableList())

    @Override
    protected Skin<?> createDefaultSkin(){
        return new FileViewGridSkin(this);
    }
}
这对所有类型的组件都是一样的


此外,您还可以签出包含大量示例的项目列表。

如何将3个单元格放在一行中?您必须在listview中设置自定义单元格工厂,您可以将所需内容放在单元格中。我最终借助您的答案进行了编辑,但代码中存在一些问题,我将很快提出更新您的帖子。无法覆盖SkinBase的最终方法是我在2017-07年获得的getNode部分是,
getNode
SkinBase
中的
final
,我一定不明白他们为什么这样设计它。一个人应该怎么做呢?你怎么能把3个单元格放在一行上?你必须在listview中设置一个自定义的单元格工厂你可以在单元格上放置你想要的内容。我最终根据你的答案进行了编辑,但是你的代码中有一些问题,我将很快提出更新您的帖子。无法覆盖SkinBase的最终方法是我在2017-07年获得的getNode部分是,
getNode
SkinBase
中的
final
,我一定不明白他们为什么这样设计它。一个人应该怎么做呢?