2014-01-09 54 views
7

我正在使用JavaFX,我的應用程序有一個表,我可以添加元素到表中,但我想創建一個上下文菜單,當我右鍵單擊該行時顯示在一行上。TableView的一行上下文菜單?

我有什麼...

在場景生成器我有,當右鍵菜單被激活上運行,但是這不是正是我想要的一種方法。這將是很好,因爲我在程序中從表中獲取選定的項目,只要我想要。這個問題,如果我保留我目前所擁有的,就是獲取上下文菜單以在所選元素上彈出。

contextMenu是包含菜單項的上下文菜單。 connectedUsers是的TableView

以下是最接近我可以得到的,但它顯示的TableView中

contextMenu.show(connectedUsers, Side.BOTTOM, 0, 0); 
+0

對於ContextMenus對TableViews,TableRows和TableCells一個非常充分的討論,參見[這](HTTPS ://www.marshall.edu/genomicjava/2013/12/30/javafx-tableviews-with-contextmenus/) –

回答

7

底部的上下文菜單中嘗試這個..

ContextMenu cm = new ContextMenu(); 
MenuItem mi1 = new MenuItem("Menu 1"); 
cm.getItems().add(mi1); 
MenuItem mi2 = new MenuItem("Menu 2"); 
cm.getItems().add(mi2); 

table.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { 

    @Override 
    public void handle(MouseEvent t) { 
     if(t.getButton() == MouseButton.SECONDARY) { 
      cm.show(table, t.getScreenX(), t.getScreenY()); 
     } 
    } 
}); 
+0

它完美的工作!你能不能給一個項目添加一個'setOnAction'的例子?謝謝 – Robb1

+0

@ Robb1我希望它能幫助你https://stackoverflow.com/questions/21344244/minimize-panel-button/21347019#21347019 –

+0

這不是安裝在行上,而是在表中。因此,如果表格是空的,將顯示上下文菜單... – multiplayer1080

7

我相信如here中討論的那樣,最好的解決方案就是這樣。

table.setRowFactory(
    new Callback<TableView<Person>, TableRow<Person>>() { 
     @Override 
     public TableRow<Person> call(TableView<Person> tableView) { 
      final TableRow<Person> row = new TableRow<>(); 
      final ContextMenu rowMenu = new ContextMenu(); 
      MenuItem editItem = new MenuItem("Edit"); 
      editItem.setOnAction(...); 
      MenuItem removeItem = new MenuItem("Delete"); 
      removeItem.setOnAction(new EventHandler<ActionEvent>() { 

       @Override 
       public void handle(ActionEvent event) { 
        table.getItems().remove(row.getItem()); 
       } 
      }); 
      rowMenu.getItems().addAll(editItem, removeItem); 

      // only display context menu for non-null items: 
      row.contextMenuProperty().bind(
       Bindings.when(Bindings.isNotNull(row.itemProperty())) 
       .then(rowMenu) 
       .otherwise((ContextMenu)null)); 
      return row; 
    } 
}); 
6

的JavaFX 8(和λ):

MenuItem mi1 = new MenuItem("Menu item 1"); 
mi1.setOnAction((ActionEvent event) -> { 
    System.out.println("Menu item 1"); 
    Object item = table.getSelectionModel().getSelectedItem(); 
    System.out.println("Selected item: " + item); 
}); 

ContextMenu menu = new ContextMenu(); 
menu.getItems().add(mi1); 
table.setContextMenu(menu); 

參見: https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ContextMenu.html

+0

要導入哪個庫以使用'Item'? Intellij沒有任何建議 – Robb1

+0

@ Robb1,Item是我自己創建的一個類。無論你的桌子包含什麼。發佈編輯。 查看https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/SelectionModel.html#getSelectedItem-- – ceklock