- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个ListView,其中每个单元格都由一个标签和一个按钮组成。我想让按钮在鼠标飞过单元格时出现,并在鼠标飞出时消失。为此,我在 ListCell 对象上使用了 setOnMouseEntered() 方法,但按钮仅出现在第一个单元格(添加到 ObservableList 的最新项目)
我的自定义 ListCell 类:
public class SubscribedTopicListCell extends ListCell<String> {
private final Label lSubscribedTopic = new Label();
private final Button btnUnsubscribe = new Button();
private static final ImageView ivBtnGraphic = new ImageView(new Image("resources/images/cross.png"));
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setGraphic(null);
if (!empty && item != null) {
lSubscribedTopic.setText(item);
btnUnsubscribe.setVisible(false);
btnUnsubscribe.setGraphic(ivBtnGraphic);
btnUnsubscribe.setBackground(Background.EMPTY);
btnUnsubscribe.setOnAction(e ->
MqttConnection.getInstance().unsubscribe(item)
);
this.setOnMouseEntered(e ->
btnUnsubscribe.setVisible(true)
);
this.setOnMouseExited(e ->
btnUnsubscribe.setVisible(false)
);
GridPane listCellPane = new GridPane();
listCellPane.add(lSubscribedTopic, 0, 0);
listCellPane.add(btnUnsubscribe, 1, 0);
ColumnConstraints col0 = new ColumnConstraints();
col0.setHalignment(HPos.LEFT);
ColumnConstraints col1 = new ColumnConstraints();
col1.setHalignment(HPos.RIGHT);
col1.setHgrow(Priority.ALWAYS);
listCellPane.getColumnConstraints().addAll(col0, col1);
setGraphic(listCellPane);
}
}
}
如何使其适用于每个单元格?
最佳答案
只有一个单元格可以有按钮,因为您已将 ImageView
设为静态。 ImageView
是 Node
,并且每个节点在场景图中只能出现一次。通过将 ImageView
设为静态,您可以尝试将相同的 ImageView
强制放入场景图中的多个位置。当您在按钮上调用 setGraphic(...)
时, ImageView 实际上会从前一个按钮中删除,以满足它只能在场景图中使用一次的规则。 (我怀疑所有按钮确实都在那里,但只有一个有图形:因为没有文本,也没有背景,所以其他按钮完全不可见,可能是零维度。)
修复方法是将 ImageView
设为实例变量。请注意,Image
不是节点,多个ImageView
可以共享同一个Image
,因此可以避免通过将 Image
设为静态,在内存中生成图像数据的多个副本。
最后,虽然它不会真正改变功能,但每次调用 updateItem()
时重新注册监听器并没有真正的意义;您只需在构造函数中执行一次即可。布局也类似:
public class SubscribedTopicListCell extends ListCell<String> {
private final Label lSubscribedTopic = new Label();
private final Button btnUnsubscribe = new Button();
private static final Image image = new Image("resources/images/cross.png");
private final ImageView ivBtnGraphic = new ImageView(image);
private final GridPane listCellPane = new GridPane();
public SubscribedTopicListCell() {
btnUnsubscribe.setOnAction(e ->
MqttConnection.getInstance().unsubscribe(getItem())
);
this.setOnMouseEntered(e ->
btnUnsubscribe.setVisible(true)
);
this.setOnMouseExited(e ->
btnUnsubscribe.setVisible(false)
);
listCellPane.add(lSubscribedTopic, 0, 0);
listCellPane.add(btnUnsubscribe, 1, 0);
ColumnConstraints col0 = new ColumnConstraints();
col0.setHalignment(HPos.LEFT);
ColumnConstraints col1 = new ColumnConstraints();
col1.setHalignment(HPos.RIGHT);
col1.setHgrow(Priority.ALWAYS);
listCellPane.getColumnConstraints().addAll(col0, col1);
btnUnsubscribe.setVisible(false);
btnUnsubscribe.setGraphic(ivBtnGraphic);
btnUnsubscribe.setBackground(Background.EMPTY);
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setGraphic(null);
if (!empty && item != null) {
lSubscribedTopic.setText(item);
setGraphic(listCellPane);
}
}
}
关于java - ListView 单元格上的 setOnMouseEntered/Exited,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35407554/
我相信所有这些(甚至是 die() 或 die(0))都是相同的。如果它们不相同,那么哪个更适合成功退出脚本?如果它们相同,是否有任何首选标准表明脚本成功完成?我倾向于使用 exit;. 编辑:所有答
我想知道Java中以下之间的区别 System.exit(0);System.exit(-1);System.exit(1); 我什么时候必须适本地使用上面的代码?
我注意到 Powershell 中有一个奇怪的行为。有两个 .ps1 文件: main.ps1: echo "running exit.ps1" $myexitcode = & ".\exit.p
Anylogic Process Modeling Library 中很少有像“Source”这样的 block 具有“On exit”和“On at exit”这样的操作。两者有什么区别? 我试图创
所以我有这个 Bash 脚本: #!/bin/bash PID=`ps -u ...` if [ "$PID" = "" ]; then echo $(date) Server off: no
(gdb) info symbol exit exit in section .text of /lib64/libc.so.6 (gdb) info symbol _exit _exit in se
如果我想启动一个简单的应用程序,几周前我使用它没有出现错误,我会收到错误消息。那是他的错误描述: Launching lib\main.dart on SM J530F in debug mode..
这个问题已经有答案了: Using Platform.exit() and System.exit(int) together (3 个回答) 已关闭 5 年前。 这里有人建议使用后者。我是java新
我的理解是,在 bash 中,一个普通的 exit 将完成一个具有最后一个命令的退出状态的脚本。但我也看到有人使用 exit $? 并且当我建议它具有相同的行为时被质疑。 这两个脚本之间有什么有意义的
我看到一些代码是这样做的: if(something){ echo 'exit from program'; die; } ...more code 和其他只使用 die 的人: if
exit和exit有什么区别!在 ruby 中? 最佳答案 一些事情: 退出处理程序以“退出”形式而非“退出!”形式运行。这意味着分配给“清理”的任何代码都不会使用“退出!”运行 “退出状态”在“退出
我们有一堆 .bat构建脚本由基于 PowerShell 的 GitLab 运行程序调用,这些脚本最近从以下内容重构: program args if !errorlevel! neq 0 exit
我想关闭具有指定返回码的 javafx 应用程序。浏览 SO 上的答案,我发现了以下成语: Platform.exit(); System.exit(0); 例如这里: Stop threads be
exit 和 C++ 中的 std::exit 有什么区别?我已经对其进行了研究,但我找不到任何东西。 这两个代码有什么区别: 1: if(SDL_Init(SDL_INIT_EVERYTHING)
我需要一个替代方法来在线程函数内终止 python 脚本。我的意图是在客户端输入 0 时终止服务器...这是否不起作用,因为线程尚未终止?这是我的代码: socket = socket.socket(
我想在崩溃后重新启动应用程序。我正在使用下面的代码来执行该任务。 Intent mStartActivity = new Intent(HomeActivity.this, SplashScreen
在Delphi中,你可以退出一个函数并给它一个返回值,这与C/C++/Java/C#等中的return关键字非常相似 Exit(1); 但是,我通常会写这样的内容: Result := 1; Exit
我想知道是否有任何方法可以处理浏览器退出事件。 例如,我想在用户单击交叉退出或关闭浏览器时发送查询。 最佳答案 我想我已经找到了解决办法。我没有在 IE 上测试过它,但它似乎在 Firefox 上运行
我在 Archlinux 的 mkinitcpio 脚本中找到了以下代码片段。 cleanup() { if [[ $workdir ]]; then # when PRESE
我使用以下代码计算数据帧所有行之间的余弦相似度: from pyspark.ml.feature import Normalizer from pyspark.mllib.linalg.distrib
我是一名优秀的程序员,十分优秀!