gpt4 book ai didi

javafx-2 - 如何检测按键

转载 作者:行者123 更新时间:2023-12-02 19:39:20 25 4
gpt4 key购买 nike

我想创建要在其中配置热键快捷键的表。

我有这个简单的表格:

    public static final String Column1MapKey = "A";
public static final String Column2MapKey = "B";

private ObservableList<Map> generateDataInMap() {
int max = 110;
ObservableList<Map> allData = FXCollections.observableArrayList();
for (int i = 1; i < max; i++) {
Map<String, String> dataRow = new HashMap<>();

String value1 = "A" + i;
String value2 = "B" + i;

dataRow.put(Column1MapKey, value1);
dataRow.put(Column2MapKey, value2);

allData.add(dataRow);
}
return allData;
}

public TabPane hotKeysContent(){

TableColumn<Map, String> firstDataColumn = new TableColumn<>("Actions");
TableColumn<Map, String> secondDataColumn = new TableColumn<>("Shortcut");

firstDataColumn.setCellValueFactory(new MapValueFactory(Column1MapKey));
firstDataColumn.setMinWidth(230);
secondDataColumn.setCellValueFactory(new MapValueFactory(Column2MapKey));
secondDataColumn.setMinWidth(230);

TableView table_view = new TableView<>(generateDataInMap());
table_view.setPadding(new Insets(5, 5, 5, 5));

table_view.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); // Autoresize when window size is changed

table_view.setEditable(true);
table_view.getSelectionModel().setCellSelectionEnabled(true);
table_view.getColumns().setAll(firstDataColumn, secondDataColumn);
Callback<TableColumn<Map, String>, TableCell<Map, String>>
cellFactoryForMap = new Callback<TableColumn<Map, String>,
TableCell<Map, String>>() {
@Override
public TableCell call(TableColumn p) {
return new TextFieldTableCell(new StringConverter() {
@Override
public String toString(Object t) {
return t.toString();
}
@Override
public Object fromString(String string) {
return string;
}
});
}
};
firstDataColumn.setCellFactory(cellFactoryForMap);
secondDataColumn.setCellFactory(cellFactoryForMap);

return null;
}

我希望当我单击第二列中的一行时获得我将按下的键组合,然后使用这些键激活键盘快捷键。任何例子都会有帮助。

P.S 表包含命令:

public static final String Column1MapKey = "A";
public static final String Column2MapKey = "B";

private ObservableList<Map> generateDataInMap() {
int max = 110;
ObservableList<Map> allData = FXCollections.observableArrayList();
for (int i = 1; i < max; i++) {
Map<String, String> dataRow = new HashMap<>();

String value1 = "A" + i;
String value2 = "B" + i;

dataRow.put(Column1MapKey, value1);
dataRow.put(Column2MapKey, value2);

allData.add(dataRow);
}
return allData;
}

public TabPane hotKeysContent(){

TabPane tabPane = new TabPane();
//tabPane.setStyle("-fx-font-size: 13pt;"); // Set size of the tab name

Tab tabA = new Tab();
Label tabALabel = new Label("Shortcuts");
//tabALabel.setStyle("-fx-font-size: 12pt;"); // Set size of the tab name
tabA.setGraphic(tabALabel);
tabA.setClosable(false); // da se mahne opciqta da se zatvarq tab


TableColumn<Map, String> firstDataColumn = new TableColumn<>("Actions");
TableColumn<Map, String> secondDataColumn = new TableColumn<>("Shortcut");

firstDataColumn.setCellValueFactory(new MapValueFactory(Column1MapKey));
firstDataColumn.setMinWidth(230);
secondDataColumn.setCellValueFactory(new MapValueFactory(Column2MapKey));
secondDataColumn.setMinWidth(230);

TableView table_view = new TableView<>(generateDataInMap());
table_view.setPadding(new Insets(5, 5, 5, 5));

table_view.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); // Autoresize when window size is changed

table_view.setEditable(true);
table_view.getSelectionModel().setCellSelectionEnabled(true);
table_view.getColumns().setAll(firstDataColumn, secondDataColumn);
Callback<TableColumn<Map, String>, TableCell<Map, String>>
cellFactoryForMap = new Callback<TableColumn<Map, String>,
TableCell<Map, String>>() {
@Override
public TableCell call(TableColumn p) {
return new TextFieldTableCell(new StringConverter() {
@Override
public String toString(Object t) {
return t.toString();
}
@Override
public Object fromString(String string) {
return string;
}
});
}
};
firstDataColumn.setCellFactory(cellFactoryForMap);
secondDataColumn.setCellFactory(cellFactoryForMap);

tabA.setContent(table_view);
tabPane.getTabs().add(tabA);

return tabPane;
}

最佳答案

下面是一个SSCCE,虽然没有tableView,也没有列或单元格。但逻辑是相似的。检查它的线索并根据您的需要编写您自己的代码:

public class ShortCutDemo extends Application {

private KeyEvent shortcutKeyEvent;
private EventHandler selectedEventHandler;
private List<EventHandler> eventHandlers;
private HBox root;

@Override
public void start(Stage primaryStage) {

root = new HBox(10);
root.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
// Do not filter for TextFields
if (event.getTarget() instanceof TextField) {
return;
}
if (isKeyEventsAreEqual(event, shortcutKeyEvent)) {
// then apply shortcut event
selectedEventHandler.handle(null);
event.consume();
}
}
});

eventHandlers = new ArrayList<EventHandler>();
eventHandlers.add(new EventHandler() {
@Override
public void handle(Event event) {
root.setStyle("-fx-background-color: lightgray");
}
});

eventHandlers.add(new EventHandler() {
@Override
public void handle(Event event) {
root.setSpacing(50);
}
});

ChoiceBox cb = new ChoiceBox();
cb.getItems().addAll("HBox background = gray", "HBox spacing = 50");
cb.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
selectedEventHandler = eventHandlers.get(newValue.intValue());
}
});
cb.getSelectionModel().selectFirst(); // default value

final TextField textField = new TextField();
textField.setEditable(false);

textField.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (event.getCode() == KeyCode.TAB) {
// Platform.runLater(new Runnable() {
// @Override
// public void run() {
// root.requestFocus();
// }
// });
} else {
// Clear the previous text
textField.setText("");
// Process only desired key types
if (event.getCode().isLetterKey()
|| event.getCode().isDigitKey()
|| event.getCode().isFunctionKey()) {
String shortcut = event.getCode().getName();
if (event.isAltDown()) {
shortcut = "Alt + " + shortcut;
}
if (event.isControlDown()) {
shortcut = "Ctrl + " + shortcut;
}
if (event.isShiftDown()) {
shortcut = "Shift + " + shortcut;
}
textField.setText(shortcut);
shortcutKeyEvent = event;
} else {
shortcutKeyEvent = null;
}
}
}
});

Button button = new Button("Reset");
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
textField.setText("");
root.setSpacing(10);
root.setStyle("-fx-background-color: white");
shortcutKeyEvent = null;
}
});

root.getChildren().addAll(new Label("Define a shortcut for "), cb, textField, button);
Scene scene = new Scene(root, 900, 150);
primaryStage.setScene(scene);
primaryStage.show();
}

private boolean isKeyEventsAreEqual(KeyEvent event1, KeyEvent event2) {
return event1 != null
&& event2 != null
&& event1.getCode() == event2.getCode()
&& event1.isAltDown() == event2.isAltDown()
&& event1.isControlDown() == event2.isControlDown()
&& event1.isShiftDown() == event2.isShiftDown();
}

public static void main(String[] args) {
launch(args);
}
}

它是如何工作的?
1) 从选择框中选择一个操作(事件)类型。
2) 将焦点置于文本字段并输入所需的快捷键,例如 Alt+F1
3) 按 Tab 将焦点移出 TextField。
4) 再次按快捷键(在本例中为Alt+F1)以查看正在运行的事件。
5) 按“Reset”按钮确实可以重置状态。

进一步的改进应该是定义一个模型类,该类具有快捷键、Ctrl、Alt 和 Shift 的 bool 值、要处理的事件处理程序以及适当重写 equals(...) 方法。

关于javafx-2 - 如何检测按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18585186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com