我是FX新手,对Java不太陌生,所以请耐心等待!我有一个简单的应用程序,它使用一个由ObservableList支持的JavaFX TableView。
当我第一次启动应用程序时,我生成了另一个Thread(从Application的start方法)来监听对日志文件的更改并将另一个元素添加到观察列表中,以便在TableView中立即可见该行。我认为在窗口中有一个包含当前大小的Label会很有好处。我正在尝试将Label的text Property绑定到观察列表的大小。我的第一次尝试产生了:
tableSizeLabel.text属性(). bind(Bindings.size((tableView.getItems())). asString());
但是我相信我误解了Bindings API。我意识到,ist.size()返回的是一个常规int,而不是它工作所必需的观测值,但是我认为Bindings类有一个静态方法来为我创建一个。
后端模型将列表包含为静态变量(我省略了侦听更改部分):
public class LogFileListener implements Runnable {
private static final ObservableList<SNMPTrap> model = FXCollections.observableArrayList();
@Override
public void run() {
String line = null;
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileLocation)))) {
while ((line = br.readLine()) != null) {
model.add(parseTrap(line));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static ObservableList<SNMPTrap> getModel() {
return model;
}
}
应用类:
public class TableDisplay extends Application {
@Override
public void start(Stage stage) throws Exception {
new Thread(new LogFileListener()).start();
Parent root = FXMLLoader.load(getClass().getResource("path/to/FXML"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
控制器类:
public class TableDisplayController implements Initializable {
@FXML
private TableView<SNMPTrap> tableView;
@FXML
private Label tableSizeLabel;
@Override
public void initialize(URL url, ResourceBundle rb) {
tableView.setItems(LogFileListener.getModel());
tableSizeLabel.textProperty().bind(Bindings.size((tableView.getItems())).asString());
}
这在外汇交易中可能吗?我是否需要将更改侦听器添加到整个ObservableList中,然后才使用getSize()更新标签?
提前感谢!
您的绑定语句对于您想要实现的目标是正确的(将Label的文本属性绑定到可观察列表的大小)。
您的代码存在并发问题。会发生的情况是LogFileListener在自己的线程中运行,更新项目列表,项目在LogFileListener线程中更新,触发JavaFX应用程序线程对场景图的更新。这是一件“坏事”,因为JavaFX使用单个GUI线程。
您需要做的是确保绑定触发器和表项更新只发生在JavaFX应用程序线程上(并且您可能需要以一种有效的方式来这样做,以免用太多的小更新调用使JavaFX事件处理器过载)。
当前解决方案的一个简单修复方法是使用以下代码。
final SNMPTrap trap = parseTrap(line);
Platfrom.runLater(new Runnable() {
@Override public void run() {
model.add(trap);
}
});
您的应用程序可能会从更复杂的方法中受益。您可以在平台上搜索StackOverflow以查找相关问题。runLater、Task、Service和JavaFX并发主题,以及查看有关JavaFX中并发性的Oracle文档和Task javadoc,以更好地了解所有这些内容的工作原理以及您的选项。
我想做的是: 我有一个JavaFX窗口,我通过拖动不断改变它的宽度和高度。然后的文本具有以下格式: 例子: 我想使用绑定,而不是使用2(两)个ChangeListeners来实现这一点。 我也读过这个问题JavaFX绑定到多个属性
我正在用一个库编程,我不知道代码,只知道方法,我不能修改它。我试着制作一个“航班”的表格视图,但我不知道如何为每个航班命名(或ID)。有人能帮我吗?谢谢此处有一些代码:
我编写的应用程序使用表示和编辑数据列表。 我有数据模型。类似于 如何用包装每个列表项,或者最佳方法是什么?
我在使用可观察类制作DropDownList时遇到问题。 下面是可观察类的代码: 这是我的工作下拉列表: 这是我的DropDownList的html: 最后,这是我从observable datasource请求中得到的结果: 我做了一些研究,但找不到任何合适的例子。 我看了看:MVVM小部件绑定和周围玩数据绑定,数据值字段,数据文本字段,但不能得到我想要的结果。 因此,我正在寻找的是一种将常规D
有没有办法将ArrayList转换为ObservableList?我想在不遍历ArrayList的情况下完成它。 更具体地说,我使用ORMLite从数据库中获取数据,我需要作为从DB获取数据的方法的输出。 目前我正在做这样的事情: 我想这样做:
谢谢你的任何线索!