Поскольку у вашего абстрактного класса нет состояния, вы можете преобразовать его в Trait (Interface), а в Scala вы можете определить интерфейсы с помощью методов, как показано ниже
trait Equipment{
var numberOwned = 0
var name: String = ""
def goldPerSecond(): Double = {
numberOwned
}
}
class TestEquipment extends FunSuite with Equipment {
this.numberOwned = 0
test("first test"){
}
}
. и реализовать интерфейс оборудования.
Как уже упоминалось в комментариях, вы не можете наследовать от FunSuite и BaseClass одновременно.
Вы пробовали JXTree ? (к сожалению, сайт сейчас недоступен, но вы можете поискать зеркала в Google)
Используйте код, который вы используете, чтобы построить свои TreeNode и перестроить TreeNode только с теми элементами, которые вы хотите. Установите корневой узел на TreeModel с отфильтрованным корневым узлом.
Моя возможная реализация:
TreeModel
, базовый и фильтрованный. TreeModel
, пересоберите отфильтрованную TreeModel
с нуля. Клонируйте каждый узел, который должен быть видим, и добавьте его к его первому видимому предку в отфильтрованной TreeModel
(или к корню, если его нет). Если вам интересно, посмотрите код ниже. Это имеет неприятный побочный эффект - сворачивание каждого пути, открытого пользователем. Чтобы обойти это, я добавил TreeModelListener
к отфильтрованной TreeModel
. Когда модель изменяется, я сохраняю расширенные пути в JTree
(используя getExpandedDescendants ()
), а затем повторно расширяю их позже (используя SwingUtilities. invokeLater ()
).
Мне пришлось переопределить equals ()
в классе TreeNode
, который я использовал, чтобы новые клонированные узлы были такими же, как и старые клонированные узлы.
...
populateFilteredNode(unfilteredRoot, filteredRoot);
...
void populateFilteredNode(TreeNode unfilteredNode, TreeNode filteredNode)
{
for (int i = 0; i < unfilteredNode.getChildCount(); i++)
{
TreeNode unfilteredChildNode = unfilteredNode.getChildAt(i);
if (unfilteredChildNode.getType() == Type.INVISIBLE_FOLDER)
{
populateFilteredNode(unfilteredChildNode, filteredNode);
}
else
{
TreeNode filteredChildNode = unfilteredChildNode.clone();
filteredNode.add(filteredChildNode);
populateFilteredNode(unfilteredChildNode, filteredChildNode);
}
}
}
Если вы ищете коммерческое решение, JideSoft предлагает древовидную модель с возможностью фильтрации. Помимо этого, SwingX имеет API-интерфейс фильтра, который будет работать с JXTable, JXTreeTable, JXTree и JXList.
Пока это дерево, которое вы показываете, тогда TreeModel
, фильтрующий существующий TreeModel
, должен быть достаточно простым.
Вы должны знать о GlazedLists . Это фантастическая библиотека для выполнения сложных преобразований таблиц без особых усилий. Они также расширились до деревьев. Может потребоваться небольшой рефакторинг существующего кода, чтобы заставить его работать так, как GlazedLists. Но посмотрите демо и веб-трансляции, чтобы увидеть, насколько это мощно. (На мой взгляд, это одна из важнейших библиотек Swing, и у нее открытый исходный код.)