Статьи

Часть Deux из создания калькулятора с Shiny New JavaFX SDK 1.0

В первом посте из этой серии приложений « Простой калькулятор » мы предприняли несколько шагов к созданию простого калькулятора. Мы используем комп, показанный ниже, который предоставил графический дизайнер Марк Дингман из Malden Labs:

Calculator_comp

В учебных целях я использую очень постепенный, а иногда и косвенный подход к построению этого. Например, в первом посте я использовал класс SwingButton для клавиш калькулятора. В этом посте мы будем использовать группу , состоящую из объекта Rectangle и Text, для создания каждого ключа. Кроме того, мы будем использовать выражение for для краткого создания ключей — техника, которая имеет еще одно преимущество, связанное с обработкой событий, которое вы увидите через мгновение. И помните, что калькулятор в своем текущем состоянии просто отображает введенные ключи, а не выполняет какие-либо вычисления. Мы создадим этот код, когда покажем вам, как определять классы, функции и т. Д. В JavaFX.

 

Нажмите на изображение калькулятора выше, чтобы вызвать апплет JavaFX Simple Calculator, или значок Java Web Start ниже, чтобы приложение появилось в его собственном окне:

Webstart.small2

Понимание кода, лежащего в основе этого апплета JavaFX

Посмотрите на код ниже, и обратите внимание, что изменилось с момента его первое воплощение .

/*
 * SimpleCalc2.fx
 *
 * Developed 2008 by James L. Weaver (jim.weaver at javafxpert.com)
 * to demonstrate creating applications using JavaFX SDK 1.0
 */
package javafxpert;

import javafx.ext.swing.*;
import javafx.stage.Stage;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.input.*;
import javafx.scene.layout.*;
import javafx.scene.paint.*;
import javafx.scene.shape.*;
import javafx.scene.text.*;
import javafx.scene.transform.*;

/**
 * The "stage" for the application
 */
Stage {
  // The model
  var displayStr:String;
  var keyLabels = ["7", "8", "9", "+",
           "4", "5", "6", "-",
           "1", "2", "3", "x",
           "0", ".", "=", "/"];

  title: "Calculator 2"
  scene: Scene {
    // The gradient on the calculator keys
    var btnGradient = LinearGradient {
      startX: 0.0, startY: 0.0,
      endX: 0.0, endY: 1.0
      stops: [
        Stop {
          offset: 0.0
          color: Color.rgb(166, 166, 168)
        },
        Stop {
          offset: 1.0
          color: Color.rgb(122, 122, 122)
        }
      ]
    };
    content: [
      // The rounded rectangle behind the entire calculator
      Rectangle {
        width: 278
        height: 401
        arcWidth: 16
        arcHeight: 16
        fill: LinearGradient {
          startX: 0.0, startY: 0.0,
          endX: 0.5, endY: 1.0
          stops: [
            Stop {
              offset: 0.0
              color: Color.rgb(119, 116, 123)
            },
            Stop {
              offset: 1.0
              color: Color.rgb(2, 2, 2)
            }
          ]
        },
      },
      VBox {
        transforms: bind Translate.translate(20, 20)
        spacing: 27
        content: [
          // The calculator's display
          TextBox {
            text: bind displayStr
            width: 238
            height: 65
            editable: false
            style: bind "text-fill: #343434; "
                  "background-fill: #f4f4f4; "
                  "font: 28pt Dialog; "
                  "font-weight: bold; "
          },
          // The calculator's keys
          VBox {
            spacing: 2
            content: for (row in [0..3]) {
              HBox {
                spacing: 2
                content: for (column in [0..3]) {
                  Group {
                    var rectRef:Rectangle;
                    var textRef:Text;
                    content: [
                      rectRef = Rectangle {
                        width: 58
                        height: 50
                        fill: btnGradient
                      },
                      textRef = Text {
                        transforms: bind
                          Translate.translate((rectRef.layoutBounds.width -
                                     textRef.layoutBounds.width) / 2,
                                     (rectRef.layoutBounds.height -
                                     textRef.layoutBounds.height) / 2)
                        content: keyLabels[row * 4 + column]
                        textOrigin: TextOrigin.TOP
                        fill: Color.rgb(222, 222, 222)
                        font: Font {
                          name: "Arial Bold"
                          size: 30
                        }
                      }
                    ]
                    onMouseClicked: function(me:MouseEvent):Void {
                      displayStr = "{displayStr}{textRef.content}"
                    }
                  }
                }
              }
            }
          }
        ]
      }
    ]
  }
}

Обратите внимание на выражения for, которые создают HBox для каждой строки, и группу для каждого ключа калькулятора в строке. Значение выражения for — это последовательность (массив Think) объектов. Дополнительную информацию о выражении for можно найти в справочнике по языку JavaFX (в разработке на момент написания статьи).

Еще одним заслуживающим внимания элементом является значение атрибута transforms в объекте Text . Приведенная выше функция Translate.translate позволяет центрировать текст по горизонтали и вертикали в пределах прямоугольника.

Одним из преимуществ использования выражения for является то, что для всех ключей требуется только один обработчик событий, а не один для каждого ключа, как в предыдущей версии Simple Calculator. В этом случае атрибут onMouseClicked находится в группе, содержащей прямоугольник и текст.

Еще один интересный момент — использование класса LinearGradient, чтобы приложение стало больше похоже на графическую композицию, показанную выше. Обратитесь к документации API JavaFX для получения дополнительной информации об использовании этого класса. Кстати, документация по API доступна как в Интернете, так и в JavaFX SDK.

Пожалуйста, оставьте комментарий, если у вас есть какие-либо вопросы!

С Уважением,

Джим Уивер
JavaFXpert.com