-
Bug
-
Resolution: Fixed
-
P5
-
7u21, 8
-
Windows 7 - 64bits - Java 8 build 117
The below code creates a TableView with two columns. The cells of the second column are editable (uses a TextFieldTableCell).
The TextFieldTableCells has a context menu defined.
Double-click on any cell in the second column, the textfield will appear. Right-click inside the textfield, you will get two context menus that overlap each others (one from the textfieldCell and one from the textfield).
This is a very minor issue, however a more expected behavior would be either to:
1- See a context menu that combines both actions.
2- See one of the two menus. In this case, the right-click event should be consumed by one of the components and not reach the other.
package test;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;
public class ContextMenuTest extends Application {
private TableView<File> table;
public ContextMenuTest() {
}
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
try {
Scene scene = new Scene(createRegion());
stage.setScene(scene);
stage.setTitle("Tester App");
stage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
private Parent createRegion() {
VBox vBox = new VBox();
table = new TableView<File>();
table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
TableColumn<File, String> firstNameCol = new TableColumn<File, String>(
"Name");
firstNameCol
.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<File, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(
CellDataFeatures<File, String> arg0) {
return arg0.getValue().nameProperty();
}
});
TableColumn<File, String> valueCol = new TableColumn<File, String>(
"Value");
valueCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<File, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(
CellDataFeatures<File, String> arg0) {
return arg0.getValue().valueProperty();
}
});
valueCol.setCellFactory(new Callback<TableColumn<File, String>, TableCell<File, String>>() {
@Override
public TableCell<File, String> call(TableColumn<File, String> arg0) {
TextFieldTableCell<File, String> cell = new TextFieldTableCell<>();
ContextMenu contextMenu = new ContextMenu();
cell.setContextMenu(contextMenu);
contextMenu.getItems().add(new MenuItem("Hello2"));
contextMenu.getItems().add(new MenuItem("World2"));
return cell;
}
});
valueCol.setEditable(true);
table.setEditable(true);
table.getColumns().setAll(firstNameCol, valueCol);
table.setColumnResizePolicy(table.CONSTRAINED_RESIZE_POLICY);
table.getItems().add(new File("test1", "value0", 1.0));
table.getItems().add(new File("hello", "value1", 3.0));
table.getItems().add(new File("hello", "value2", 3.0));
vBox.getChildren().addAll(table);
return vBox;
}
public class File {
private StringProperty name;
private StringProperty value;
public File(String string) {
nameProperty().set(string);
}
public File(String string, String value, Double modified) {
nameProperty().set(string);
valueProperty().set(value);
}
public void setName(String value) {
nameProperty().set(value);
}
public String getName() {
return nameProperty().get();
}
public StringProperty nameProperty() {
if (name == null) {
name = new SimpleStringProperty(this, "name");
}
return name;
}
public void setValue(String value) {
valueProperty().set(value);
}
public String getValue() {
return valueProperty().get();
}
public StringProperty valueProperty() {
if (value == null) {
value = new SimpleStringProperty(this, "value");
}
return value;
}
}
}
The TextFieldTableCells has a context menu defined.
Double-click on any cell in the second column, the textfield will appear. Right-click inside the textfield, you will get two context menus that overlap each others (one from the textfieldCell and one from the textfield).
This is a very minor issue, however a more expected behavior would be either to:
1- See a context menu that combines both actions.
2- See one of the two menus. In this case, the right-click event should be consumed by one of the components and not reach the other.
package test;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;
public class ContextMenuTest extends Application {
private TableView<File> table;
public ContextMenuTest() {
}
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
try {
Scene scene = new Scene(createRegion());
stage.setScene(scene);
stage.setTitle("Tester App");
stage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
private Parent createRegion() {
VBox vBox = new VBox();
table = new TableView<File>();
table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
TableColumn<File, String> firstNameCol = new TableColumn<File, String>(
"Name");
firstNameCol
.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<File, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(
CellDataFeatures<File, String> arg0) {
return arg0.getValue().nameProperty();
}
});
TableColumn<File, String> valueCol = new TableColumn<File, String>(
"Value");
valueCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<File, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(
CellDataFeatures<File, String> arg0) {
return arg0.getValue().valueProperty();
}
});
valueCol.setCellFactory(new Callback<TableColumn<File, String>, TableCell<File, String>>() {
@Override
public TableCell<File, String> call(TableColumn<File, String> arg0) {
TextFieldTableCell<File, String> cell = new TextFieldTableCell<>();
ContextMenu contextMenu = new ContextMenu();
cell.setContextMenu(contextMenu);
contextMenu.getItems().add(new MenuItem("Hello2"));
contextMenu.getItems().add(new MenuItem("World2"));
return cell;
}
});
valueCol.setEditable(true);
table.setEditable(true);
table.getColumns().setAll(firstNameCol, valueCol);
table.setColumnResizePolicy(table.CONSTRAINED_RESIZE_POLICY);
table.getItems().add(new File("test1", "value0", 1.0));
table.getItems().add(new File("hello", "value1", 3.0));
table.getItems().add(new File("hello", "value2", 3.0));
vBox.getChildren().addAll(table);
return vBox;
}
public class File {
private StringProperty name;
private StringProperty value;
public File(String string) {
nameProperty().set(string);
}
public File(String string, String value, Double modified) {
nameProperty().set(string);
valueProperty().set(value);
}
public void setName(String value) {
nameProperty().set(value);
}
public String getName() {
return nameProperty().get();
}
public StringProperty nameProperty() {
if (name == null) {
name = new SimpleStringProperty(this, "name");
}
return name;
}
public void setValue(String value) {
valueProperty().set(value);
}
public String getValue() {
return valueProperty().get();
}
public StringProperty valueProperty() {
if (value == null) {
value = new SimpleStringProperty(this, "value");
}
return value;
}
}
}
- relates to
-
JDK-8095918 ContextMenu displays old Menus that should have been deleted
- Resolved