Пишу программу, при клике на коричневый прямоугольник слева(назовем его кнопка настроек) из него появляется полоска, а категория, которая связана с с ним уходит вправо(меняет свою ширину,чтобы показать эту полоску)
При клике на кнопку настроек все остальные кнопки деактивируются, и активируются только лишь тогда, когда я снова нажму на текущую кнопку настроек
Программа отлично работает, НО! ооочень много кода) здесь только прописано для 3 категорий, а когда будет все 8 категорий, размер кода увеличится в 10 раз, и даже IDEA подсказывает мне,что код дублируется.
ВОПРОС: Как все оптимизировать и уменьшить размер кода?
я знаю,что например можно деактивацию Toggle Buttons(коричневые прямоугольники , кнопки настроек) можно не прописывать как-то для каждой категории все 8 штук для каждой категориии отдельно,но как это сделать я не знаю=(
Буду признателен за ответ
*Всю разметку делаю через Scene Builder, и там же назначаю экшны для кнопок и методы
Видео
Класс Main:
package card;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.input.*;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import java.awt.*;
public class Main extends Application {
//create variables for dragggable window
private double xOffset = 0;
private double yOffset = 0;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
try {
Parent root = FXMLLoader.load(getClass().getResource("/card/card.fxml"));
Scene scene = new Scene(root, 1200, 600);
scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
primaryStage.setMaximized(true);
primaryStage.setScene(scene);
primaryStage.initStyle(StageStyle.DECORATED.UNDECORATED);
//make application draggable
root.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
xOffset = event.getSceneX();
yOffset = event.getSceneY();
}
});
root.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
primaryStage.setX(event.getScreenX() - xOffset);
primaryStage.setY(event.getScreenY() - yOffset);
}
});
//assign ALT+ENTER to maximize window
final KeyCombination kb = new KeyCodeCombination(KeyCode.ENTER, KeyCombination.ALT_DOWN);
scene.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (kb.match(event)) {
primaryStage.setMaximized(!primaryStage.isMaximized());
}
}
});
//show stage
primaryStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Класс Controller:
package card;
import javafx.animation.*;
import javafx.scene.control.*;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.*;
import javafx.event.ActionEvent;
import javafx.util.Duration;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable {
@FXML private AnchorPane anchorRow;
@FXML private HBox hBoxCat0;
@FXML private ToggleButton btnPref1;
@FXML private ToggleButton btnPref2;
@FXML private ToggleButton btnPref3;
@FXML private ToggleButton btnPref4;
@FXML private ToggleButton btnPref5;
@FXML private ToggleButton btnPref6;
@FXML private ToggleButton btnPref7;
@FXML private ToggleButton btnPref8;
@FXML private Label category1;
@FXML private Label category2;
@FXML private Label category3;
private ToggleGroup group;
@Override
public void initialize(URL location, ResourceBundle resources) {
group = new ToggleGroup();
this.btnPref1.setToggleGroup(group);
this.btnPref2.setToggleGroup(group);
this.btnPref3.setToggleGroup(group);
}
@FXML
void openPreference1(ActionEvent event) {
Timeline tmHbox1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(hBoxCat0.prefWidthProperty(), 250)));
Timeline tmHboxOne1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(hBoxCat0.prefWidthProperty(), 10)));
if (btnPref1.isSelected()) {
GridPane.setRowIndex(anchorRow, 0);
Timeline timelineHCategory1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(category1.prefWidthProperty(), 1610)));
tmHbox1.play();
timelineHCategory1.play();
btnPref2.setDisable(true);
btnPref3.setDisable(true);
}
else {
Timeline timelineHCategoryOne1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(category1.prefWidthProperty(), 1900)));
timelineHCategoryOne1.play();
tmHboxOne1.play();
btnPref2.setDisable(false);
btnPref3.setDisable(false);
}
}
//Open preference window and make width animation for categories
@FXML
void openPreference2(ActionEvent event) {
Timeline tmHbox1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(hBoxCat0.prefWidthProperty(), 250)));
Timeline tmHboxOne1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(hBoxCat0.prefWidthProperty(), 10)));
if (btnPref2.isSelected()) {
GridPane.setRowIndex(anchorRow, 1);
Timeline timelineHCategory2 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(category2.prefWidthProperty(), 1610)));
timelineHCategory2.play();
tmHbox1.play();
btnPref1.setDisable(true);
btnPref3.setDisable(true);
}
else {
Timeline timelineHCategoryTwo2 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(category2.prefWidthProperty(), 1900)));
timelineHCategoryTwo2.play();
tmHboxOne1.play();
btnPref1.setDisable(false);
btnPref3.setDisable(false);
}
}
@FXML
void openPreference3(ActionEvent event) {
Timeline tmHbox1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(hBoxCat0.prefWidthProperty(), 250)));
Timeline tmHboxOne1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(hBoxCat0.prefWidthProperty(), 10)));
if (btnPref3.isSelected()) {
GridPane.setRowIndex(anchorRow, 2);
Timeline timelineHCategory3 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(category3.prefWidthProperty(), 1610)));
timelineHCategory3.play();
tmHbox1.play();
btnPref1.setDisable(true);
btnPref2.setDisable(true);
}
else {
Timeline timelineHCategoryThree3 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(category3.prefWidthProperty(), 1900)));
timelineHCategoryThree3.play();
tmHboxOne1.play();
btnPref1.setDisable(false);
btnPref2.setDisable(false);
}
}
}
FXML: