Events 在TableView上处理ScrollEvent占用了太多的CPU时间
我有一个名为Events 在TableView上处理ScrollEvent占用了太多的CPU时间,events,javafx,scroll,event-handling,tableview,Events,Javafx,Scroll,Event Handling,Tableview,我有一个名为tablevere的TableView,我想检查每一行的条件(stockcolumn value),并在滚动时对它们执行一些代码,所以我写了这个代码,但这会让程序消耗大量CPU时间,我不熟悉Lambda表达式,所以有没有更简单的方法来写这个 tableVerre.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { @Override public void handle(Sc
tablevere
的TableView
,我想检查每一行的条件(stock
column value),并在滚动时对它们执行一些代码,所以我写了这个代码,但这会让程序消耗大量CPU时间,我不熟悉Lambda表达式,所以有没有更简单的方法来写这个
tableVerre.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent scrollEvent) {
stock.setCellFactory(column -> {
return new TableCell<VerreFX, Number>() {
@Override
protected void updateItem(Number item, boolean empty) {
super.updateItem(item, empty);
TableRow<VerreFX> currentRow = getTableRow();
if (empty || item == null) {
setText("");
setGraphic(null);
currentRow.setStyle(tableVerre.getStyle());
} else {
setText(getItem().toString());
}
if (!isEmpty()) {
if ((int) item == 0 && st.getVerresBOX()) currentRow.setStyle("-fx-background-color:lightcoral");
}
}
};
});
}
});
tableVerre.addEventFilter(ScrollEvent.ANY,neweventhandler()){
@凌驾
公共无效句柄(ScrollEvent ScrollEvent){
stock.setCellFactory(列->{
返回新的TableCell(){
@凌驾
受保护的void updateItem(数字项,布尔值为空){
super.updateItem(项,空);
TableRow currentRow=getTableRow();
if(空| |项==null){
setText(“”);
设置图形(空);
currentRow.setStyle(tableVerre.getStyle());
}否则{
setText(getItem().toString());
}
如果(!isEmpty()){
如果((int)item==0&&st.getVerresBOX())currentRow.setStyle(“-fx背景色:lightcoral”);
}
}
};
});
}
});
当用户滚动时,表格视图将重复使用单元格,并在重新用于新项目时自动调用单元格上的updateItem
。因此,您应该只设置一次单元工厂,然后让表视图完成它设计的任务。如果您使用的是FXML,则可以在initialize()
方法中设置单元格工厂,或者在创建表和列的任何地方设置单元格工厂
您的单元格实现不太正确:因为单元格可能被重用以任意显示任意两个不同的项目,所以您需要考虑所有可能的条件。在您的实现中,如果一个单元格显示一个项目,该项目的item.intValue()==0
,然后被重用以显示一个项目,该项目的item.intValue()!=0,则样式将无法正确更新
还请注意,您应该通过调用intValue()
将Number
转换为int
TableColumn-stock;
// ...
stock.setCellFactory(列->新表单元格(){
@凌驾
受保护的void updateItem(数字项,布尔值为空){
super.updateItem(项,空);
TableRow currentRow=getTableRow();
if(空| |项==null){
setText(“”);
设置图形(空);
currentRow.setStyle(tableVerre.getStyle());
}否则{
setText(getItem().toString());
}
如果(!isEmpty()){
if(item.intValue()==0&&st.getVerresBOX()){
currentRow.setStyle(“-fx背景色:淡珊瑚”);
}否则{
currentRow.setStyle(tableVerre.getStyle());
}
}
}
});
您应该能够完全删除滚动事件处理程序。首先,除了使用CPU时间外,您没有涵盖所有滚动情况,因为如果用户使用向下/向上键或滚动条滚动,则不会触发滚动事件。因此,您必须再添加两个EventFilter
,第一个将使用滚动条处理滚动
tableVerre.addEventFilter(MouseEvent.MOUSE_CLICKED,(
MouseEvent event)->
{
if ((event.getTarget() instanceof TableColumnHeader) | event.isDragDetect()) {
System.err.println("Mouse Draged : " + event.toString());
stock.setCellFactory((TableColumn<VerreFX, Number> column) -> {
return new TableCell<VerreFX, Number>() {
@Override
protected void updateItem(Number item, boolean empty) {
super.updateItem(item, empty);
TableRow<VerreFX> currentRow = getTableRow();
if (empty || item == null) {
setText("");
setGraphic(null);
currentRow.setStyle(tableVerre.getStyle());
} else {
setText(getItem().toString());
}
if (!isEmpty()) {
if ((int) item == 0 && st.getVerresBOX()) {
currentRow.setStyle("-fx-background-color:lightcoral");
}
}
}
};
});
}
});
tableVerre.addEventFilter(MouseEvent.MOUSE_单击(
MouseEvent事件)->
{
if((event.getTarget()instanceof TableColumnHeader)| event.isDragDetect()){
System.err.println(“鼠标拖动:+event.toString());
stock.setCellFactory((TableColumn列)->{
返回新的TableCell(){
@凌驾
受保护的void updateItem(数字项,布尔值为空){
super.updateItem(项,空);
TableRow currentRow=getTableRow();
if(空| |项==null){
setText(“”);
设置图形(空);
currentRow.setStyle(tableVerre.getStyle());
}否则{
setText(getItem().toString());
}
如果(!isEmpty()){
if((int)item==0&&st.getVerresBOX()){
currentRow.setStyle(“-fx背景色:淡珊瑚”);
}
}
}
};
});
}
});
第二个将使用键盘键向下/向上处理滚动
tableVerre.addEventFilter(KeyEvent.KEY_PRESSED,new EventHandler<KeyEvent>(){
@Override
public void handle(KeyEvent event) {
if (event.getCode() == KeyCode.DOWN | event.getCode() == KeyCode.UP) {
stock.setCellFactory(column -> {
return new TableCell<VerreFX, Number>() {
@Override
protected void updateItem(Number item, boolean empty) {
super.updateItem(item, empty);
TableRow<VerreFX> currentRow = getTableRow();
if (empty || item == null) {
setText("");
setGraphic(null);
currentRow.setStyle(tableVerre.getStyle());
} else {
setText(getItem().toString());
}
if (!isEmpty()) {
if ((int) item == 0 && st.getVerresBOX()) {
currentRow.setStyle("-fx-background-color:lightcoral");
}
}
}
};
});
}
System.err.println("Key Pressed : " + event.toString());
}
});
tableVerre.addEventFilter(按下KeyEvent.KEY\u,新建EventHandler()){
@凌驾
公共无效句柄(KeyEvent事件){
if(event.getCode()==KeyCode.DOWN | event.getCode()==KeyCode.UP){
stock.setCellFactory(列->{
返回新的TableCell(){
@凌驾
受保护的void updateItem(数字项,布尔值为空){
super.updateItem(项,空);
TableRow currentRow=getTableRow();
if(空| |项==null){
setText(“”);
设置图形(空);
currentRow.setStyle(tableVerre.getStyle());
}否则{
setText(getItem().toString());
}
如果(!isEmpty()){
if((int)item==0&&st.getVerresBOX()){
currentRow.setStyle(“-fx背景色:淡珊瑚”);
}
}
}
};
});
}
System.err.println(“按键:+event.toString());
}
});
为什么要替换滚动处理程序中的cellFactory
?可能是
tableVerre.addEventFilter(KeyEvent.KEY_PRESSED,new EventHandler<KeyEvent>(){
@Override
public void handle(KeyEvent event) {
if (event.getCode() == KeyCode.DOWN | event.getCode() == KeyCode.UP) {
stock.setCellFactory(column -> {
return new TableCell<VerreFX, Number>() {
@Override
protected void updateItem(Number item, boolean empty) {
super.updateItem(item, empty);
TableRow<VerreFX> currentRow = getTableRow();
if (empty || item == null) {
setText("");
setGraphic(null);
currentRow.setStyle(tableVerre.getStyle());
} else {
setText(getItem().toString());
}
if (!isEmpty()) {
if ((int) item == 0 && st.getVerresBOX()) {
currentRow.setStyle("-fx-background-color:lightcoral");
}
}
}
};
});
}
System.err.println("Key Pressed : " + event.toString());
}
});