我的数据源提供了一个ObservableList<String>,但是对于我的 ListView 我需要一个ObservableList<Warning>.
AWarning基本上只是字符串的装饰器,添加一个布尔值以提供一种跟踪 ListView 复选框状态的方法,如本答案中所提议的。
class Warning {
private final ReadOnlyStringWrapper name;
private final BooleanProperty checked;
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
目前,我正在观察原始列表中的更改事件,并手动添加/删除警告列表中的项目:
ObservableList<String> stringList = ...;
ObservableList<Warning> warningList = ...;
stringList.addListener(new ListChangeListener<String>() {
@Override
public void onChanged(ListChangeListener.Change<? extends String> change) {
if (change.wasAdded()) {
warningList.addAll(change.getAddedSubList().stream().map(Warning::new).collect(Collectors.toList()));
} else if (change.wasRemoved()) {
change.getRemoved().forEach(str -> {
warningList.removeIf(w -> str.equals(w.name));
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否有一种更优雅的方式来装饰我的字符串类型列表,以便它可以用作警告类型列表,而无需手动传递更改事件?
更准确地说:如果在原始列表中添加或删除字符串,我希望立即在警告列表中看到此更改,从而在 ListView 中看到此更改。
是否可以在具有固定执行顺序的其他一些测试之间执行多个嵌套测试?
例如
@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(OrderAnnotation.class)
class MyTest {
private State state = State.ZERO;
@Test
@Order(1)
public void step1() throws IOException {
state = State.ONE;
}
@Order(2) // sth like this, however this annotation isn't allowed here
@Nested
class WhileInStateOne {
@Test
public void step2a {
Assumptions.assumeTrue(state == State.ONE);
// test something
}
@Test
public void step2b {
Assumptions.assumeTrue(state == State.ONE);
// test something else
}
}
@Test
@Order(3)
public void step3() throws IOException {
state = State.THREE;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道,单元测试通常应该是无状态的,但是在这种情况下,如果我可以以固定顺序重用状态,我可以节省大量执行时间。
我想根据它是 32 位控件还是 64 位控件来切换我用于 activex 控件的 GUID。我宁愿没有两个 .rc 文件来执行此操作。但是,资源编译器会忽略我在 BEGIN - END 块中的预处理器定义,并且始终默认为 #else 部分中的 Control。请让我知道除了拥有两个不同的资源(.rc)文件之外,是否还有更好的方法来做到这一点。
BEGIN
#ifdef _Win64
CONTROL "",IDC_TCHART1,"{FCB4B50A-E3F1-4174-BD18-54C3B3287258}",WS_TABSTOP,0,15,445,199
#else
CONTROL "",IDC_TCHART1,"{FAB9B41C-87D6-474D-AB7E-F07D78F2422E}",WS_TABSTOP,0,15,445,199
#endif
END
Run Code Online (Sandbox Code Playgroud) 延迟接口需要任何接口
此接口的实现[to]定义一个compareTo方法,该方法提供与其getDelay方法一致的排序.
但是我想知道,为什么Java 8中没有默认实现,因为compareTo合同要求完全依赖于getDelay.
有没有具体的理由将其留给实施班?或者在覆盖超级界面时是否无法创建默认方法?
编辑:为了使我的问题更容易理解,这是一个例子:
interface Delayed extends Comparable<Delayed> {
long getDelay(TimeUnit unit);
@Override
default int compareTo(Delayed o) {
// might not be the perfect "compareTo" implementation, but you get the point
return o == this? 0:
Long.compare(this.getDelay(TimeUnit.NANOSECONDS), o.getDelay(TimeUnit.NANOSECONDS);
}
}
Run Code Online (Sandbox Code Playgroud) 我想一个JavaFX注册ListChangeListener一个ObservableList.但是我注意到,在某些情况下,监听器没有被调用.
(1)如果监听器是方法参考,一切都有效:
// using a direct method reference:
private final ListChangeListener<String> listener = this::listDidChange;
/* ... */
public void init() {
list.addListener(listener);
}
Run Code Online (Sandbox Code Playgroud)
(2)但是如果Listener是同一方法的弱引用,则不调用监听器:
// using a weak method reference:
private final ListChangeListener<String> listener = new WeakListChangeListener<String>(this::listDidChange);
/* ... */
public void init() {
list.addListener(listener);
}
Run Code Online (Sandbox Code Playgroud)
(3)现在真正有趣的部分是,它再次起作用,即使它应该与前面的例子相同:
// direct method reference wrapped into a weak ref later:
private final ListChangeListener<String> listener = this::listDidChange;
/* ... */
public void init() {
list.addListener(new WeakListChangeListener<String>(listener));
} …Run Code Online (Sandbox Code Playgroud) 我是Camunda的新手,没有找到任何解释如何实现以下内容的教程或参考资料:
在开始流程时,我希望用户在发票中添加他喜欢的项目.在下一个用户任务中,所有这些项目及其数量应打印给批准数据的人.
我还不明白如何在流程及其变量工作之间获得这种1:n关系.我是否需要为每个项目启动子流程?或者我必须使用自定义Java对象?如果是这样,我如何从任务列表中将表单元素映射到这样的对象?