当前位置: 首页 > 知识库问答 >
问题:

在javafx项目中保留helper方法的设计

石苏燕
2023-03-14

这可能是更多的设计选择,我想“为什么要重新发明轮子”。有人可能已经需要这个了。

(我不想使用任何第三方框架,因为我的框架是一个小项目。我已经在使用Adam Bein的afterburner.fx)。我正在JavaFX中实现一个独立的应用程序。我对MVC/MVP/MVVM非常感兴趣。由于javafx允许我使用fxml分离UI,所以我通过fxml实现了大部分UI设计。但在那里我遇到了一些问题。

  • tradeview.fxml(我所有的UI设计都在这里)
  • TradeController(我所有的UI事件处理(还有一些业务逻辑)都在这里)
  • 交易(实体类)
TableView<Trade> myTableView;
<TableColumn fx:id="tradeOidTableColumn" prefWidth="130.0" text="Trade Oid">
    <cellValueFactory><PropertyValueFactory property="oid"/></cellValueFactory>
</TableColumn>
myTradeEntity.commodity().commodityShortName();

来获取值,它工作得很好。但是你们知道,虽然fxml我还是做不到这一点。它不支持嵌套绑定。

不可能

<cellValueFactory><PropertyValueFactory property="commodity.commodityShortName"/></cellValueFactory>

所以我被迫使用一个单元格值工厂。我定义了一个类CommodityCellValueFactory并将其绑定。例如:

<TableColumn fx:id="commodityTableColumn" prefWidth="220.0" text="Commodity">
    <cellValueFactory><CommodityCellValueFactory /></cellValueFactory>
</TableColumn>  
String tempCommodityShortName;
String getTempCommodityShortName()
{
    return commodity.commodityShortName();
}
interface ITradeEntityHelper
{
//all helper methods goes here
}

class TradeEntity implements ITradeEntityHelper
{
//real entity methods goes here
}

我将把接口绑定到我的tableViewtableview 而不是tableview 如果我在尝试愚蠢的事情,请更正我

现在的问题是,如何在ITRADEEntityHelper接口中获取TradeEntity引用,以便可以询问

tradeEntity.Commodity().commodityShortName().

(或者)像这样

interface ITrade{}
class Trade implements ITrade{}
class TradeAdditions implements ITrade{}

将帮助器方法保留在additions类中。

我也想为我的控制器类实现同样的功能。

class TradeController implements ITradeController, Initializable
{
}

共有1个答案

梁丘高朗
2023-03-14

您可以使用绑定通过多级层次结构选择值。select。这允许您创建一个CellValueFactory类:

import java.util.Arrays;
import javafx.beans.NamedArg;
import javafx.beans.binding.Bindings;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.util.Callback;

public class NestedPropertyValueFactory<S, T> implements Callback<TableColumn.CellDataFeatures<S, T>, ObservableValue<T>> {

    private final String[] steps;
    private final PropertyValueFactory firstStepSelector;

    /**
     * @param property a string containing the names of the properties seperated
     * by '.'.
     */
    public NestedPropertyValueFactory(@NamedArg("property") String property) {
        String[] properties = property.split("\\.");
        firstStepSelector = new PropertyValueFactory<>(properties[0]);
        this.steps = Arrays.copyOfRange(properties, 1, properties.length);
    }

    @Override
    public ObservableValue<T> call(TableColumn.CellDataFeatures<S, T> param) {
        // use PropertyValueFactory for first step and Bindings.select for
        // additonal steps.
        return Bindings.select(firstStepSelector.call(param), steps);
    }

}

此类可用作fxml文件中的CellValueFactory

<cellValueFactory>
    <NestedPropertyValueFactory property="commodity.commodityShortName"/>
</cellValueFactory>

注意,如果任何中间步骤产生null,您将在system.err中得到警告。

 类似资料:
  • 我有一个属性文件(键/值)对,从中我当前根据键读取一个值,并在UI中显示该值。 复杂性增加了,现在基于某些公式,该值更具动态性。该公式包含一个变量参数,我将在运行时获取其值。 是否有任何java设计模式来设计此场景。 我想在属性文件中针对一个键放置一个方法名。 现在我将读取键并获取方法名称。此方法将计算该特定键的值。 请告诉我你的建议

  • 我使用我在这里找到的原型创建了一个Maven JavaFX项目:https://github.com/openjfx/javafx-maven-archetypes 一切都运行顺利,我可以运行一个项目,带有一些标签、文本框和一些按钮,没有问题。但是,当我尝试添加WebView元素(尽管IntelliJ中的场景生成器可以识别)时,我无法让导入工作。 我的pom.xml: 我的主要fxml文档来描述视

  • 所以我在这个问题上挣扎了很长一段时间。我想在Netbeans中创建一个新的JavaFX项目,但是我没有从列表中选择JavaFX的选项。因为我有最新的java版本,JavaFX应该包含在SDK中,对吗?我还查找了是否有位于目录我也这么做。那么为什么我不能创建一个常规的JavaFX项目呢?我是不是错过了什么? 提前谢谢你!

  • 问题内容: 根据我正在阅读的Django文档,似乎在app文件夹中是一个不错的起点,但是我面临的问题是,当我为创建信号并尝试从模型中导入类时,它与在我的模型中。 此代码将无法运行,因为我Comm_Queue在内部signals.py导入了信号,也在内部也导入了信号models.py。 谁能建议我如何解决这个问题? 问题答案: 对于Django <1.7的原始答案: 你可以通过导入应用程序的文件来注

  • 是的,不确定我是否做错了什么,或者这是Laravel中的Illumb\Database的问题。 我的代码: groupBy之前的结果是: 但对于groupBy: 所以我的问题是,我想去掉对象中的类型。。。 有什么想法吗?

  • 堆栈跟踪 我试过关于这个话题的所有解答,但我总是得到同样的错误。