2012-07-01 14 views
2

Je veux ajouter un menu contextuel à la tableview, plus précisément je veux afficher le menu contextuel sur les lignes de table sur un clic droit.Menu contextuel dans TableView JAVAFX 2.1

J'ai essayé avec ce code

final EventHandler click = new EventHandler() { 
      public void handle(MouseEvent t) { 

      } 

       @Override 
       public void handle(Event arg0) { 
       } 
    }; 
      final Context menu = new ContextMenu(); 
    MenuItem item = new MenuItem("Add Image"); 
    item.setOnAction(new EventHandler() { 
      public void handle(ActionEvent t) 
      { 
      } 
       @Override 
       public void handle(Event arg0) 
       { 
        //some code here 
      }}); 
    menu.getItems().addAll(item); 
    EditingCell cellFactory = new EditingCell(click,menu); 
     TableColumn col = new TableColumn("column1"); 
    col.setCellFactory(cellFactory); 

code ci-dessus fonctionne correctement dans JavaFX 2.0, et je reçois un menu contextuel sur clic droit, comment jamais quand je lance mon code avec JavaFX 2.1 Menu contextuel ne fonctionne pas .

J'ai essayé d'obtenir la méthode de menu contextuel montrant la propriété à l'aide showingProperty() et il est soit faux dans JavaFX 2.1 et vrai dans JavaFX 2.0

De plus, j'ai aussi essayé de faire ma classe cellfactory personnalisée et voici mon code (I il a fallu de l'exemple officiel JavaFX TreeView menu contextuel)

import javafx.event.Event; 
import javafx.event.EventHandler; 
import javafx.scene.control.*; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 

class TextFieldTreeCellImpl extends TableCell<String,String> { 

    private TextField textField; 
    private ContextMenu addMenu = new ContextMenu(); 

    public TextFieldTreeCellImpl() { 
     MenuItem addMenuItem = new MenuItem("Add Employee"); 
     addMenu.getItems().add(addMenuItem); 
     addMenuItem.setOnAction(new EventHandler() { 
      public void handle(Event t) { 

      } 
     }); 
     setContextMenu(addMenu); 
    } 

    @Override 
    public void startEdit() { 
     super.startEdit(); 

     if (textField == null) { 
      createTextField(); 
     } 
     setText(null); 
     setGraphic(textField); 
     textField.selectAll(); 
    } 

    @Override 
    public void cancelEdit() { 
     super.cancelEdit(); 

     setText((String) getItem()); 
     //setGraphic(getTableCell().getGraphic()); 
    } 

    @Override 
    public void updateItem(String item, boolean empty) { 
     super.updateItem(item, empty); 

     if (empty) { 
      setText(null); 
      setGraphic(null); 
     } else { 
      if (isEditing()) { 
       if (textField != null) { 
        textField.setText(getString()); 
       } 
       setText(null); 
       setGraphic(textField); 
      } else { 
       setText(getString()); 
       //setGraphic(getTreeItem().getGraphic()); 



      } 
     } 
    } 

    private void createTextField() { 
     textField = new TextField(getString()); 
     textField.setOnKeyReleased(new EventHandler<KeyEvent>() { 

      @Override 
      public void handle(KeyEvent t) { 
       if (t.getCode() == KeyCode.ENTER) { 
        commitEdit(textField.getText()); 
       } else if (t.getCode() == KeyCode.ESCAPE) { 
        cancelEdit(); 
       } 
      } 
     }); 

    } 

    private String getString() { 
     return getItem() == null ? "" : getItem().toString(); 
    } 
} 

et j'ajouté cette cellfactory personnalisée comme:

final Callback<TableColumn, TableCell> cellFactory = 
new Callback<TableColumn, TableCell>() { 
    public TableCell call(TableColumn p) { 
     return new TextFieldTreeCellImpl(); 
} 

}; 
col.setCellFactory(cellFactory); 

Toujours est wo rking bien dans JavaFX 2.0, mais pas dans JavaFX 2.1

S'il vous plaît aidez-moi, je suis un moment difficile ...

+0

Est-ce un bogue dans JavaFX 2.1? – Deepak

Répondre

3

Les deux tutoriels TreeView et TableView officiels fonctionnent très bien avec JavaFX 2.1. Le problème est que vous mélangez ces exemples de code. Vous ne pouvez pas renvoyer le TreeCell lorsque la fabrique de cellules du TableColumn nécessite TableCell. Il suffit de suivre le tutoriel TableView seul seulement et remplacer le EditingCell avec la suivante qui a contextMenu:

import javafx.event.Event; 
import javafx.event.EventHandler; 
import javafx.scene.control.ContextMenu; 
import javafx.scene.control.MenuItem; 
import javafx.scene.control.TableCell; 
import javafx.scene.control.TextField; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 

class EditingCell extends TableCell<Person, String> { 

    private TextField textField; 
    private ContextMenu addMenu = new ContextMenu(); 

    public EditingCell() { 
     MenuItem addMenuItem = new MenuItem("Print Me"); 
     addMenu.getItems().add(addMenuItem); 
     addMenuItem.setOnAction(new EventHandler() { 

      public void handle(Event t) { 
       // Do something with current row 
       Person curr = getTableView().getItems().get(getIndex()); 
       System.out.println(curr.getFirstName() + " " + curr.getLastName()); 
      } 
     }); 
    } 

    @Override 
    public void startEdit() { 
     super.startEdit(); 

     if (textField == null) { 
      createTextField(); 
     } 
     setText(null); 
     setGraphic(textField); 
     textField.selectAll(); 
    } 

    @Override 
    public void cancelEdit() { 
     super.cancelEdit(); 
     setText((String) getItem()); 
     setGraphic(null); 
    } 

    @Override 
    public void updateItem(String item, boolean empty) { 
     super.updateItem(item, empty); 

     if (empty) { 
      setText(null); 
      setGraphic(null); 
     } else { 
      if (isEditing()) { 
       if (textField != null) { 
        textField.setText(getString()); 
       } 
       setText(null); 
       setGraphic(textField); 
      } else { 
       setText(getString()); 
       setGraphic(null); 
       setContextMenu(addMenu); 
      } 
     } 
    } 

    private void createTextField() { 

     textField = new TextField(getString()); 
     textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2); 
     textField.setOnKeyReleased(new EventHandler<KeyEvent>() { 

      @Override 
      public void handle(KeyEvent t) { 
       if (t.getCode() == KeyCode.ENTER) { 
        commitEdit(textField.getText()); 
       } else if (t.getCode() == KeyCode.ESCAPE) { 
        cancelEdit(); 
       } 
      } 
     }); 
    } 

    private String getString() { 
     return getItem() == null ? "" : getItem().toString(); 
    } 
} 
+0

ma classe EditingCell a déjà la même implémentation du menu contextuel que vous avez suggéré. mais c'est assez étrange que je suis toujours incapable d'obtenir l'effet désiré – Deepak

+0

J'ai testé mon code dans JavaFX 2.1 et il fonctionne comme prévu. Essayez avec le code de démo aussi simple que possible. –

2

Je reçois aucune réponse même en utilisant la méthode setContextMenu().

Cependant, voici comment je l'ai résolu le problème

Je viens d'enregistrer un événement de souris et a montré le menu contextuel à la position spécifiée (au clic de la souris)

this.setContextMenu(menu); 
    this.getContextMenu().setAutoHide(true); 

     EventHandler event = new EventHandler<MouseEvent>() { 
@Override 
public void handle(MouseEvent me) { 
    if (me.getButton() == MouseButton.SECONDARY) { 
    tableView.getContextMenu().show(tableView, me.getSceneX(), me.getSceneY()); 
    } 
} 
};  
     this.addEventHandler(MouseEvent.MOUSE_CLICKED,event); 
+0

si (me.getButton() == MouseButton.SECONDARY) { table.getContextMenu() show (table, me.getScreenX(), me.getScreenY());.} * au lieu de Get screen getScene * – Alex