2017-05-21 47 views
1

我想创建一个OnMouseOver监听器到TableView的特定列的单元格,以便当我将鼠标悬停在其单元格上时,弹出窗口应显示一些消息。这是我如何创建表格及其列。将悬停监听器添加到javafx表中特定列的单元格

private TableView<Stock> stockTable = new TableView<>(); 
ObservableList columns = stockTable.getColumns(); 
public TableColumn createTextColumn(String columnName, String columnCaption,BooleanProperty editingStarted) { 
    TableColumn column = new TableColumn(columnCaption); 
    column.setCellValueFactory(new PropertyValueFactory<>(columnName)); 
    column.setCellFactory(TextFieldTableCell.forTableColumn()); 
    return column; 
} 
final TableColumn nameColumn 
         = createTextColumn("name", "Product Name", editingStarted); 
columns.add(nameColumn); 

所以是有可能做到这一点。我知道如何为行创建侦听器。但是我没有在互联网上听到桌子的细胞。预先感谢您的帮助。

回答

1

你已经使用过,你需要重写TextFieldTableCell.forTableColumn(),以满足您的需求

import javafx.event.EventHandler; 
import javafx.scene.control.Label; 
import javafx.scene.control.TableCell; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.cell.TextFieldTableCell; 
import javafx.scene.input.MouseEvent; 
import javafx.stage.Popup; 
import javafx.util.Callback; 
import javafx.util.StringConverter; 
import javafx.util.converter.DefaultStringConverter; 

public final class CustomTextFieldTableCell<S, T> extends TextFieldTableCell<S, T> { 

    public static <S> Callback<TableColumn<S, String>, TableCell<S, String>> forTableColumn() { 
     return forTableColumn(new DefaultStringConverter()); 
    } 

    public static <S, T> Callback<TableColumn<S, T>, TableCell<S, T>> forTableColumn(final StringConverter<T> converter) { 
     return new Callback<TableColumn<S, T>, TableCell<S, T>>() { 
      @Override 
      public TableCell<S, T> call(TableColumn<S, T> list) { 
       final TextFieldTableCell<S, T> result = new TextFieldTableCell<S, T>(converter); 
       final Popup popup = new Popup(); 
       popup.setAutoHide(true); 

       final EventHandler<MouseEvent> hoverListener = new EventHandler<MouseEvent>() { 

        @Override 
        public void handle(MouseEvent event) { 
         final Label popupContent = new Label("this is a popup showing the content = '" + result.getText() + "'"); 
         popupContent.setStyle("-fx-background-color: #64b5f6; -fx-border-color: #000000; -fx-border-width: 1px; -fx-padding: 5px; -fx-text-fill: white;"); 

         popup.getContent().clear(); 
         popup.getContent().addAll(popupContent); 

         if (event.getEventType() == MouseEvent.MOUSE_EXITED) { 
          popup.hide(); 
         } else if (event.getEventType() == MouseEvent.MOUSE_ENTERED) { 
          popup.show(result, event.getScreenX() + 10, event.getScreenY());     
         } 
        } 
       }; 

       result.setOnMouseEntered(hoverListener); 
       result.setOnMouseExited(hoverListener); 
       return result; 
      } 
     }; 
    } 
} 

要使用它,你需要更改您的代码

column.setCellFactory(CustomTextFieldTableCell.forTableColumn()); 

结果看起来是这样的

enter image description here

+0

非常感谢您对这个解决方案!它帮助了很多。 :) – Nazim

相关问题