Написание десктопного приложения с помощью JavaFX
Решил я написать исполняемый jar файл с удобным интерфейсом для расчета своих повседневных задач по работе. Начал с самых простых.
Нужно определить критические напряжения на сдвиг исходя из типа закрепления и отношения сторон прямоугольной пластины.
Начнем с настройка интерфейса, а в помощь возьмем Scene Builder
Создадим рабочую область с размером 900х600.
Создадим несколько контейнеров c размерами и отступами(я сначала разметку делал просто на листочке, но листочек уже потерялся).
Далее пройдемся по внутренним элементам контейнеров
- Кнопка Button
Присвоим уникальное имя нашей кнопки и название метода в котором потом будем реализовывать наш код
Поле TextField
Присвоим уникальное имя нашему текстовому полю. Поле понадобиться для ввода/вывода числовых значения. Так же добавим дополнительное имя полю, которое при вводе символом будет пропадать
Поле Label я использовал для обозначения ячеек.
Тут указываем имя существующей картинки находящийся в проекте
Поле CheckBox
Тут указываем уникальное имя. Это необходимо для определения типа закрепления
Конечный код файла sample.fxml
Создание главного метода класса Main
package sample; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class Main extends Application < @Override public void start(Stage primaryStage) < try < //Ссылка на sample.fxml(наш интерфейс).Название программы и создание нашей главной сцен Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); primaryStage.setTitle("Чистый сдвиг"); primaryStage.setScene(new Scene(root)); primaryStage.show(); >catch(Exception e) < e.printStackTrace(); >> public static void main(String[] args) < launch(args); >>
Создания класса Controller.Самое важное помечено комментариями
ackage sample; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.TextField; import javafx.stage.Stage; import java.net.URL; import java.util.ResourceBundle; import static java.lang.Double.NaN; import static java.lang.Double.parseDouble; import static java.lang.String.valueOf; public class Controller extends TextField implements Initializable < //Создание переменных разлчиных типов связанных с интерфейсом @FXML private TextField myTextField4; @FXML private TextField myTextField1; @FXML private TextField myTextField2; @FXML private TextField myTextField3; @FXML private TextField myTextField5; @FXML private TextField myTextField6; @FXML private TextField myTextField7; @FXML private CheckBox checkbox1; @FXML private CheckBox checkbox2; @FXML private CheckBox checkbox3; @FXML private CheckBox checkbox4; private double k; private double krit; private double zapas; @Override public void initialize(URL location, ResourceBundle resources) < //Применения фильтра для ввода параметров myTextField1.setTextFormatter(new AlphaNumericTextFormatter()); myTextField2.setTextFormatter(new AlphaNumericTextFormatter()); myTextField3.setTextFormatter(new AlphaNumericTextFormatter()); myTextField4.setTextFormatter(new AlphaNumericTextFormatter()); //myTextField6.setTextFormatter(new AlphaNumericTextFormatter()); >public void showDateTime() throws Exception < //Перевод строки в число Double a = parseDouble(myTextField1.getText()); Double b = parseDouble(myTextField2.getText()); Double t = parseDouble(myTextField3.getText()); Double e = parseDouble(myTextField4.getText()); Double c = b / a; //Условия выбора CheckBox и отношения стороны if (checkbox1.isSelected()) < if (c else if ((c > 0.1) && (c else if ((c > 0.15) && (c else if ((c > 0.2) && (c else if ((c > 0.25) && (c else if ((c > 0.3) && (c else if ((c > 0.35) && (c else if ((c > 0.40) && (c else if ((c > 0.45) && (c else if ((c > 0.5) && (c else if ((c > 0.55) && (c else if ((c > 0.6) && (c else if ((c > 0.65) && (c else if ((c > 0.7) && (c else if ((c > 0.75) && (c else if ((c > 0.8) && (c else if ((c > 0.85) && (c else if ((c > 0.9) && (c else if ((c > 0.95) && (c krit = (k * e) / (Math.pow((b / t), 2)); String d = valueOf(krit); //перевод числа в строку myTextField5.setText(d); > else if (checkbox2.isSelected()) < if (c else if ((c > 0.1) && (c else if ((c > 0.15) && (c else if ((c > 0.2) && (c else if ((c > 0.25) && (c else if ((c > 0.3) && (c else if ((c > 0.35) && (c else if ((c > 0.40) && (c else if ((c > 0.45) && (c else if ((c > 0.5) && (c else if ((c > 0.55) && (c else if ((c > 0.6) && (c else if ((c > 0.65) && (c else if ((c > 0.7) && (c else if ((c > 0.75) && (c else if ((c > 0.8) && (c else if ((c > 0.85) && (c else if ((c > 0.9) && (c else if ((c > 0.95) && (c krit = (k * e) / (Math.pow((b / t), 2)); String d = valueOf(krit); myTextField5.setText(d); > else if (checkbox3.isSelected()) < if (c else if ((c > 0.1) && (c else if ((c > 0.15) && (c else if ((c > 0.2) && (c else if ((c > 0.25) && (c else if ((c > 0.3) && (c else if ((c > 0.35) && (c else if ((c > 0.40) && (c else if ((c > 0.45) && (c else if ((c > 0.5) && (c else if ((c > 0.55) && (c else if ((c > 0.6) && (c else if ((c > 0.65) && (c else if ((c > 0.7) && (c else if ((c > 0.75) && (c else if ((c > 0.8) && (c else if ((c > 0.85) && (c else if ((c > 0.9) && (c else if ((c > 0.95) && (c krit = (k * e) / (Math.pow((b / t), 2)); String d = valueOf(krit); myTextField5.setText(d); > else if (checkbox4.isSelected()) < if (c else if ((c > 0.1) && (c else if ((c > 0.15) && (c else if ((c > 0.2) && (c else if ((c > 0.25) && (c else if ((c > 0.3) && (c else if ((c > 0.35) && (c else if ((c > 0.40) && (c else if ((c > 0.45) && (c else if ((c > 0.5) && (c else if ((c > 0.55) && (c else if ((c > 0.6) && (c else if ((c > 0.65) && (c else if ((c > 0.7) && (c else if ((c > 0.75) && (c else if ((c > 0.8) && (c else if ((c > 0.85) && (c else if ((c > 0.9) && (c else if ((c > 0.95) && (c krit = (k * e) / (Math.pow((b / t), 2)); String d = valueOf(krit); myTextField5.setText(d); > Double f = parseDouble(myTextField6.getText()); zapas = krit/f; String g = valueOf(zapas); myTextField7.setText(g); > >
Создание двух классов для применения фильтра ввода данных (Исключение букв, а так же возможность ограничения количества вводы/выводы). Решения не мое, а нашел я его на stackoverflow.Из всех предложенных оно мне показалось самым простым и понятным.
public class AlphaNumericTextFormatter extends TextFormatter < /** The Constant ALPHA_NUMERIC_ONLY. */ //private static final String ALPHA_NUMERIC_ONLY = "^[a-zA-Z0-9]*$"; /** MAKE NUMERIC ONLY **/ private static final String DIGITS_ONLY = "^[0-9.]*$"; /** * Instantiates a new alpha numeric text formatter. */ public AlphaNumericTextFormatter() < super(applyFilter(null)); >/** * Instantiates a new alpha numeric text formatter. * * @param maxLength * the max length */ public AlphaNumericTextFormatter(int maxLength) < super(applyFilter(new MaxLengthTextFormatter(maxLength).getFilter())); >/** * Apply filter. * * @param filter * the filter * @return the unary operator */ private static UnaryOperator applyFilter(UnaryOperator filter) < return change -> < if (change.getControlNewText() != null && change.getControlNewText().matches(DIGITS_ONLY)) < if (filter != null) < filter.apply(change); >return change; > return null; >; > >
package sample; import java.util.function.UnaryOperator; import javafx.scene.control.TextFormatter; import javafx.scene.control.TextFormatter.Change; public class MaxLengthTextFormatter extends TextFormatter < private int maxLength; public MaxLengthTextFormatter(final int maxLength) < super(new UnaryOperator() < public Change apply(Change change) < if (change.isDeleted()) < if (change.getControlNewText().length() >maxLength) < change.setText(change.getText().substring(0, maxLength)); >> else if (change.getControlText().length() + change.getText().length() >= maxLength) < int maxPos = maxLength - change.getControlText().length(); change.setText(change.getText().substring(0, maxPos)); >return change; > >); this.maxLength = maxLength; > public int getMaxLength() < return this.maxLength; >>
Ну и в конце создания jar файла
На этом все. Теперь готов файл который будет запускаться на любом компьютере с установленной java.