2017-06-16 26 views
0

我遇到以下问题:如何获取ObservableList的对象,我可以在其中编写自己的方法?

我有两个名为ActiveDateList和MainFrame的类。 ActiveDateList(写成单例)正在扩展Arraylist并保存当前活动的“MyDate”。

ActiveDateList:

public class ActiveDateList extends ArrayList<MyDate>{ 

    private static ActiveDateList instance; 

    private ActiveDateList(){} 

    public static ActiveDateList getInstance(){ 
     if(instance == null){ 
      instance = new ActiveDateList(); 
     } 
     return instance; 
    } 

... 

    public void addSorted(MyDate md){ 
    ... 
    } 
} 

大型机类是一个JavaFX的应用,其需要使用 “ActiveDateList” 的一个ObservableList。

代码这样做:

ActiveDateList activeDatelist = ActiveDateList.getInstance(); 
    ObservableList<MyDate> observableADList = FXCollections.observableList(list); 

但是这样做之后,我将无法访问每一个自写的方法,我在ActiveDateList,因为像“addSorted”无法通过ObservableList访问和每次我只调用activeDateList.addSorted(..)observableADList显然不会通知监听器。

我觉得我需要一个实现了ObservableList的类,而不是必须覆盖所有的方法,它只是使用ArrayList类中的方法,并让我有可能在其中编写自己的方法。

我很感谢每一个想法。

+0

考虑添加一个'public static void addSorted(MyDate md,List list)'方法,并让您的当前非静态addSorted方法委托给它。 – VGR

+0

你的单身人士不是线程安全的。我建议为你的单例使用'enum',因为它带有singletons要求的特性(默认情况下是线程安全初始化,私有构造函数) - 检查[使用枚举实现Singleton](https://stackoverflow.com/questions/26285520 /实施-单例与-AN-枚举在-java的)。如果您更喜欢坚持'class',那么您应该实现[双重检查锁定](https://en.m.wikipedia.org/wiki/Double-checked_locking),如果单身人士将在多个线程中使用。这不是一个解决方案,只是一个建议。 –

回答

0

您应该可以扩展javafx.collections.ModifiableObservableListBase类而不是ArrayList。然后,您可以使用beginChangeendChange方法来通知侦听器。请参阅:https://docs.oracle.com/javase/8/javafx/api/javafx/collections/ObservableListBase.html#beginChange--

+0

感谢您的建议,这听起来很有意义。 但是我现在必须实现继承的抽象方法doAdd,doRemove,doSet,get和size,并且不知道在其中写入什么。 我应该添加列表现在作为类的变量,而不是让类扩展ArrayList? –

+0

是的,'ModifiableObservableListBase'的javadoc显示了一个实现的例子,其中这些方法委托给一个'ArrayList'。如果您需要该类是线程安全的,则可以考虑使用“CopyOnWriteArrayList”。 – Apokralipsa

相关问题