- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是一个初级程序员,我学了足够多的 java,现在我的目标是使用 JavaFX 为 gui 创建一个计算器,并尽可能让它成为 oop,这样在实践中,其他人很容易修改程序,我在添加按钮并想对其应用 setOnAction
方法时遇到问题,我想有一个单独的类来处理按钮事件,但我不明白如何使用这个特殊的方法
这是 Gui
类:
package calculator;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Gui extends Application {
InputHandler inputhandler = new InputHandler();
Button add = new Button();
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("HackCalc");
add.setText("+");
add.setOnAction(inputhandler);
StackPane layout = new StackPane();
layout.getChildren().add(add);
Scene scene = new Scene(layout, 330, 500);
primaryStage.setScene(scene);
primaryStage.show();
}
}
如您所见,我已经创建了一个 InputHandler
类的实例,我将向您展示并将其传递给 setOnAction
但它从未奏效,我遇到了一个令人沮丧的 NoSuchMethodException
错误。
现在,这是 InputManager
类:
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
public class InputHandler extends Gui implements EventHandler<ActionEvent>{
@Override
public void handle(ActionEvent event) {
if(event.getSource()== add){
System.out.println("InputHandler works");
}
}
}
最佳答案
首先 InputHandler
扩展 Gui
就设计而言没有意义,因为 "is" 关系 InputHandler
和 Gui
/Application
.
您最好使用匿名类/lambda 表达式作为事件处理程序,并取消对按钮的检查,但改用不同的事件处理程序。这样你就可以摆脱所有的 if (source == someButton)
检查...
有意义的是将 View 与计算器逻辑分开,使 GUI 独立于计算器逻辑。
示例
public class Calculator {
private final ObservableList<String> formulaParts = FXCollections.observableArrayList();
private final ObservableList<String> formulaPartsUnmodifiable = FXCollections.unmodifiableObservableList(formulaParts);
private final ReadOnlyStringWrapper operandString = new ReadOnlyStringWrapper();
private Integer operand;
private Integer previousOperand;
private IntBinaryOperator operator;
private boolean operandModifiable = true;
/** previous input elements as Strings */
public ObservableList<String> getFormulaParts() {
return formulaPartsUnmodifiable;
}
public final String getOperand() {
return this.operandString.get();
}
/** property contains current input as String */
public final ReadOnlyStringProperty operandProperty() {
return this.operandString.getReadOnlyProperty();
}
public void addDigit(byte digit) {
if (operandModifiable) {
operand = operand == null ? digit : operand * 10 + digit;
operandString.set(Integer.toString(operand));
}
}
public void addBinaryOperator(IntBinaryOperator operator) {
if (operand != null) {
if (previousOperand != null) {
evaluate();
}
previousOperand = operand;
operand = null;
operandString.set("");
formulaParts.setAll(Integer.toString(previousOperand), operator.toString());
this.operator = operator;
operandModifiable = true;
}
}
public void evaluate() {
if (operand != null && operator != null) {
int result = operator.applyAsInt(previousOperand, operand);
formulaParts.clear();
operandString.set(Integer.toString(result));
operandModifiable = false;
previousOperand = null;
operand = result;
}
}
}
public class BinaryPlusOperator implements IntBinaryOperator {
@Override
public int applyAsInt(int left, int right) {
return left + right;
}
@Override
public String toString() {
return "+";
}
}
public class Gui extends Application {
private final static IntBinaryOperator PLUS = new BinaryPlusOperator();
@Override
public void start(Stage primaryStage) {
Calculator calc = new Calculator();
// display parts of formula in ListView
ListView<String> formulaPartsDisplay = new ListView<>(calc.getFormulaParts());
formulaPartsDisplay.setMaxHeight(30);
formulaPartsDisplay.setOrientation(Orientation.HORIZONTAL);
Text operand = new Text();
operand.setFont(Font.font(20));
// display current input in Text
operand.textProperty().bind(calc.operandProperty());
VBox display = new VBox(5, formulaPartsDisplay, operand);
display.setAlignment(Pos.CENTER_RIGHT);
VBox.setVgrow(display, Priority.NEVER);
display.setBorder(new Border(new BorderStroke(Color.GREEN, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3))));
Button plus = new Button("+");
Button eval = new Button("=");
Button d1 = new Button("1");
// event handlers invoke appropriate methods of Calculator
plus.setOnAction(evt -> calc.addBinaryOperator(PLUS));
eval.setOnAction(evt -> calc.evaluate());
d1.setOnAction(evt -> calc.addDigit((byte) 1));
GridPane buttons = new GridPane();
buttons.add(d1, 0, 0);
buttons.addRow(1, plus, eval);
Scene scene = new Scene(new VBox(display, buttons));
primaryStage.setScene(scene);
primaryStage.show();
}
关于java - 我可以从 javaFX 中的 setOnAction 参数调用另一个类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41070280/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!