2012-07-01 2 views
2

컨텍스트 메뉴를 tableview에 추가하고 싶습니다. 특히 마우스 오른쪽 버튼을 클릭하여 테이블 행에 컨텍스트 메뉴를 표시하려고합니다.TableView의 컨텍스트 메뉴 JAVAFX 2.1

내가 코드 위

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); 

자바 FX 2.0에서 제대로 작동이 코드를했는데, 내가 마우스 오른쪽 버튼을 클릭의 상황에 맞는 메뉴를 얻고, 나는 자바 FX 2.1 컨텍스트 메뉴 나던 작품에 내 코드를 어떻게 이제까지 실행할 때 .

내가 showingProperty() 메소드를 사용하여 상황에 맞는 메뉴의 표시 속성을 얻기 위해 노력하고 자바 FX에서 자바 FX 2.1에서 false를 반환하고 진정한 2.0 내가 여기 내 사용자 지정 cellfactory 클래스를 만드는 시도하고

또한 내 코드입니다 (I

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(); 
    } 
} 

) 공식 자바 FX 트 리뷰 컨텍스트 메뉴의 예에서했다 나는대로이 사용자 정의 cellfactory을 추가 : 아직도 그 하시다입니다

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

}; 
col.setCellFactory(cellFactory); 

내가 힘든 시간을 보내고 있어요, 자바 FX 2.0의 벌금을 rking하지만 자바 FX 2.1

이 제발 도와주세요 ...

+0

이 자바 FX 2.1의 버그에서 상황에 맞는 메뉴를 보였다 어떻게? – Deepak

답변

3

모두 공식 TreeViewTableView 튜토리얼은 자바 FX 2.1과 함께 잘 작동하고 있습니다. 문제는 이러한 코드 예제를 혼합한다는 것입니다. TableColumn의 셀 팩터가 TableCell 일 때 TreeCell을 반환 할 수 없습니다. 간단히 혼자에만있는 TableView 튜토리얼을 따라 contextMenu를을 가지고 다음 하나를 사용하여 EditingCell 교체 :

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

내 EditingCell 클래스에는 사용자가 제안한 컨텍스트 메뉴와 동일한 구현이 이미 있습니다. 하지만 여전히 이상한 여전히 원하는 효과를 얻을 수 없습니다 – Deepak

+0

나는 JavaFX 2.1에서 내 코드를 테스트하고 예상대로 작동합니다. 최대한 간단하게 데모 코드를 사용해보십시오. –

2

내가 심지어 어떤 반응을 얻고 없습니다입니다 setContextMenu() 메소드를 사용하는 경우.

그러나, 이것은 내가

난 그냥 마우스 이벤트를 등록 문제를 해결하고 (마우스 클릭에서) 지정된 위치

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

if (me.getButton() == MouseButton.SECONDARY) { table.getContextMenu(). getScene * 대신 getScreen * – Alex