`

JavaFX学习之样例6

阅读更多
  该代码实现的一个最简单的计算器
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.*;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import java.util.HashMap;
import java.util.Map;

// a simple JavaFX calculator.
public class Calc extends Application {
  private static final String[][] template = {
      { "7", "8", "9", "/" },
      { "4", "5", "6", "*" },
      { "1", "2", "3", "-" },
      { "0", "c", "=", "+" }
  };

  private final Map<String, Button> accelerators = new HashMap();

  private DoubleProperty stackValue = new SimpleDoubleProperty();
  private DoubleProperty value = new SimpleDoubleProperty();

  private enum Op { NOOP, ADD, SUBTRACT, MULTIPLY, DIVIDE }

  private Op curOp   = Op.NOOP;
  private Op stackOp = Op.NOOP;

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

  @Override public void start(Stage stage) {
    final TextField screen  = createScreen();
    final TilePane  buttons = createButtons();  

    stage.setTitle("Calc");
    stage.initStyle(StageStyle.UTILITY);  //设置stage的风格,这里stage只有关闭按钮
    stage.setResizable(false);
    stage.setScene(new Scene(createLayout(screen, buttons)));
    stage.show();
  }

  //root使用的VBox,上面text。下面按钮,按钮使用的是瓦片布局,一块接一块,满了换行。
  private VBox createLayout(TextField screen, TilePane buttons) {
    final VBox layout = new VBox(20);
    layout.setAlignment(Pos.CENTER);
    layout.setStyle("-fx-background-color: chocolate; -fx-padding: 20; -fx-font-size: 20;");
    layout.getChildren().setAll(screen, buttons);
    handleAccelerators(layout);
    screen.prefWidthProperty().bind(buttons.widthProperty());
    return layout;
  }

  private void handleAccelerators(VBox layout) {
    layout.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
      @Override
      public void handle(KeyEvent keyEvent) {
        Button activated = accelerators.get(keyEvent.getText());
        if (activated != null) {
          activated.fire();   //用于快捷输入
        }
      }
    });
  }

  //创建输入框
  private TextField createScreen() {
    final TextField screen = new TextField();
    screen.setStyle("-fx-background-color: aquamarine;");
    screen.setAlignment(Pos.CENTER_RIGHT);
    screen.setEditable(false);  //不可编辑
    screen.textProperty().bind(Bindings.format("%.0f", value));    //绑定text的值
    return screen;
  }

  //创建按钮
  private TilePane createButtons() {
    TilePane buttons = new TilePane();
    buttons.setVgap(7);  //垂直之间二个物体间距
    buttons.setHgap(7);  //水平方向二个物体间距
    buttons.setPrefColumns(template[0].length);  //设置每行个数
    for (String[] r: template) {
      for (String s: r) {
        buttons.getChildren().add(createButton(s));
      }
    }
    return buttons;
  }

  //创建按钮
  private Button createButton(final String s) {
    Button button = makeStandardButton(s);

    if (s.matches("[0-9]")) {
      makeNumericButton(s, button);   //
    } else {
      final ObjectProperty<Op> triggerOp = determineOperand(s);
      if (triggerOp.get() != Op.NOOP) {
        makeOperandButton(button, triggerOp);
      } else if ("c".equals(s)) {
        makeClearButton(button);
      } else if ("=".equals(s)) {
        makeEqualsButton(button);
      }
    }

    return button;
  }

  //根据s把对应的加减乘除存放进到triigerOp
  private ObjectProperty<Op> determineOperand(String s) {
    final ObjectProperty<Op> triggerOp = new SimpleObjectProperty(Op.NOOP);
    switch (s.charAt(0)) {
      case '+': triggerOp.set(Op.ADD);      break;
      case '-': triggerOp.set(Op.SUBTRACT); break;
      case '*': triggerOp.set(Op.MULTIPLY); break;
      case '/': triggerOp.set(Op.DIVIDE);   break;
    }
    return triggerOp;
  }

  //当按下加减乘除时,设置当前操作
  private void makeOperandButton(Button button, final ObjectProperty<Op> triggerOp) {
    button.setStyle("-fx-base: lightgray;");
    button.setOnAction(new EventHandler<ActionEvent>() {
      @Override
      public void handle(ActionEvent actionEvent) {
        curOp = triggerOp.get();
      }
    });
  }

  //创建一个标准的button
  private Button makeStandardButton(String s) {
    Button button = new Button(s);
    button.setStyle("-fx-base: beige;");
    accelerators.put(s, button);  //这些button,可以用于快捷输入
    button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
    return button;
  }

  //为数字按钮设置事件
  private void makeNumericButton(final String s, Button button) {
    button.setOnAction(new EventHandler<ActionEvent>() {
      @Override
      public void handle(ActionEvent actionEvent) {
        if (curOp == Op.NOOP) {  //当前操作是数字时(你刚按下的上一个操作)
          value.set(value.get() * 10 + Integer.parseInt(s));  //没有输加减乘除时,前一数字*10
        } else {   //若当前操作不是数字,则表示是要加减乘除你刚按下的数据字
          stackValue.set(value.get());  //记录你当前文本框的值
          value.set(Integer.parseInt(s)); //设置文本框的值为刚按下的
          stackOp = curOp; //记录操作的值
          curOp = Op.NOOP; //当前操作值置空
        }
      }
    });
  }

  //清除内容
  private void makeClearButton(Button button) {
    button.setStyle("-fx-base: mistyrose;");
    button.setOnAction(new EventHandler<ActionEvent>() {
      @Override
      public void handle(ActionEvent actionEvent) {
        value.set(0);
      }
    });
  }

  //当按下等号的时候,计算加减乘除事件
  private void makeEqualsButton(Button button) {
    button.setStyle("-fx-base: ghostwhite;");
    button.setOnAction(new EventHandler<ActionEvent>() {
      @Override
      public void handle(ActionEvent actionEvent) {
        switch (stackOp) {
          case ADD:      value.set(stackValue.get() + value.get()); break;
          case SUBTRACT: value.set(stackValue.get() - value.get()); break;
          case MULTIPLY: value.set(stackValue.get() * value.get()); break;
          case DIVIDE:   value.set(stackValue.get() / value.get()); break;
        }
      }
    });
  }
}

关于fx,学习到了button.fire()方法的使用,也就是调用button的action事件。
分享到:
评论

相关推荐

    JavaFX学习之样例8

    这个"JavaFX学习之样例8"可能是一个教程或示例集合,用于教授如何使用JavaFX来创建一个特定的图形元素,比如时钟。在这个例子中,我们可能将学习如何利用JavaFX的图形和动画功能来构建一个可交互的模拟时钟。 首先...

    javafx2introbyexample:javaFX中的样例代码

    6. **CSS样式**:JavaFX支持CSS(层叠样式表)来定义UI的外观和布局。开发者可以使用CSS为应用程序添加样式,实现自定义的主题。 7. **动画和转换**:JavaFX的`Timeline`和`Transition`类允许创建各种动态效果,如...

    JavaFX2开发教程

    运行时还允许你体验官方提供的样例程序,这些样例展示了JavaFX的各种功能,源代码可供学习参考。 在NetBeans环境中配置JavaFX开发环境是另一个关键步骤。JavaFX2.0在Mac系统上的安装提供了更丰富的功能,如高性能...

    我的代码样例

    综上所述,这个压缩包“我的代码样例”提供了丰富的编程实践材料,覆盖了Java API的运用以及完整的图书管理系统开发,对于Java初学者和进阶者都有很大的学习价值。通过分析和学习这些代码,可以提升编程技巧,了解...

    javaFX2.0教程

    在学习JavaFX的过程中,不断尝试、运行样例和构建自己的项目对于掌握JavaFX是非常有帮助的。随着JavaFX 2.0的出现,开发者有了一个功能强大、跨平台的工具来创建高质量的桌面应用程序。通过本教程,你将能够学习到...

    GUI样例.7z

    总的来说,这个压缩包提供的GUI样例涵盖了基础界面设计、用户认证流程以及基本计算功能的实现,对于学习和掌握GUI编程,尤其是事件驱动编程和用户交互设计,具有很高的参考价值。通过分析和实践这些案例,开发者能够...

    jfreechart样例

    6. **良好的社区支持**:JFreeChart有活跃的开发社区,提供了丰富的文档、示例和问题解答,便于开发者学习和解决问题。 在“jfreechart样例”压缩包中,你可能会看到以下内容: - **示例代码**:这些代码展示了...

    java学习和项目中一些典型的应用场景样例代码.zip

    这个名为"java学习和项目中一些典型的应用场景样例代码.zip"的压缩包显然包含了一些Java编程的实际应用示例,旨在帮助学习者理解Java在实际项目中的运用。下面,我们将深入探讨Java的一些关键应用场景和相关知识点。...

    JAVA作业目录及样例

    本资源“JAVA作业目录及样例”是针对学习Java编程的学生们提供的一份宝贵的参考资料,它包含了Java程序设计实验和半期考试的相关内容,帮助学生理解和实践Java的核心概念。 Java程序设计实验部分通常涉及基本语法、...

    Java-Learning:java学习样例代码

    【Java学习样例代码】是针对Java编程语言的学习资源,主要包含了各种Java编程示例,旨在帮助初学者或有经验的开发者深入理解Java语言的核心概念和技术。这些代码样例涵盖了从基础语法到高级特性的广泛内容,对于学习...

    e(fx)lipse

    6. **样例代码**:提供JavaFX示例代码,帮助开发者了解和学习JavaFX API的用法。 7. **语法高亮**:对JavaFX剧本语言(FXML)提供语法高亮和错误检查。 在安装了**e(fx)lipse** 的Eclipse中,用户可以通过“File” ...

    demo.rar_DEMO

    6. **多线程**:Java内置了对多线程的支持,样例程序可能包含Thread类、Runnable接口的使用,以及线程同步和通信的方法。 7. **网络编程**:Java的Socket编程是其在网络应用中的重要特性,样例程序可能会有客户端和...

    基于智能家居,从客厅到卧室,从中控到sensor,开发者可以体验各种家居的开发样例,打造自己的家居体验,享受万物互联的快感。

    这里,我们主要关注的是基于Java的开发样例,如在"learn-java-master"这个项目中,开发者可以学习如何使用Java语言来实现智能家居系统的关键部分。 首先,让我们深入了解一下Java在智能家居中的应用。Java是一种...

    WebViewSample源码

    总结来说,`WebViewSample`源码是一个学习JavaFX如何集成Web内容的绝佳实例。通过对源码的深入理解和实践,开发者可以掌握如何在JavaFX应用程序中利用`WebView`组件展示丰富的Web内容,并实现与网页的交互。这不仅...

    21天精通java源代码

    6. **多线程**:Java提供了对多线程的支持,理解线程的创建、同步和通信,可以实现高效的并发处理。 7. **反射机制**:反射是Java的一大特色,它允许在运行时检查类、接口、字段和方法的信息,甚至动态调用方法。 ...

    JAVA简单实例

    3. **封装**: 封装是面向对象编程的三大特性之一,它隐藏了对象的内部实现细节,只对外提供公共接口。通过访问修饰符(如public、private、protected),可以控制类成员的可见性。 4. **继承与多态**: 继承允许一个...

    desktop-project:样例项目Kelompok

    为了深入理解这个项目,你需要查看源代码,学习其中的类结构、方法实现以及如何通过JavaFX或Swing等库创建图形用户界面。同时,了解如何在Java中实现文件I/O操作,处理系统事件,以及可能涉及的网络通信(如果有的话...

    Jfreechart学习资源

    JFreeChart是一个强大的开源库,专门用于生成高质量的2D图表,适用于各种Java应用程序,包括Swing、JavaFX、Applet以及Servlet。本文将深入探讨JFreeChart的基础知识、主要功能以及如何使用它来创建各种类型的图表。...

    Chris-Heavner-Portfolio-1:代码样例

    6. **桌面应用**:Java也可以用于开发桌面应用程序,如Swing和JavaFX提供了丰富的UI组件库,用于创建图形用户界面。 7. **数据处理**:Java与数据库集成良好,JDBC(Java Database Connectivity)允许开发者方便地...

    java编程实例(精心整理百个实例)

    8. **图形用户界面(GUI)设计**:Java提供了丰富的Swing和JavaFX库来创建桌面应用。实例将教你如何使用组件(如按钮、文本框、标签等)构建用户界面,响应用户事件,并实现交互逻辑。 这个Java编程实例集合是深入...

Global site tag (gtag.js) - Google Analytics